16 "<?xml version=\"1.0\"?>\r\n"
17 "<methodCall><methodName>";
32 XmlRpcUtil::log(1,
"XmlRpcClient new client: host %s, port %d.", host, port);
107 XmlRpcUtil::log(1,
"XmlRpcClient::execute: method %s completed.", method);
120 XmlRpcUtil::error(
"Error in XmlRpcClient::handleEvent: could not connect to server (%s).",
209 if (params.
valid()) {
213 for (
int i=0; i<params.
size(); ++i) {
215 body += params[i].
toXml();
222 body += params.
toXml();
231 XmlRpcUtil::log(4,
"XmlRpcClient::generateRequest: header is %d bytes, content-length is %d.",
232 header.length(), body.length());
243 "POST " +
_uri +
" HTTP/1.1\r\n"
246 header +=
"\r\nHost: ";
250 sprintf(buff,
":%d\r\n",
_port);
253 header +=
"Content-Type: text/xml\r\nContent-length: ";
255 sprintf(buff,
"%d\r\n\r\n", body.size());
257 return header + buff;
302 XmlRpcUtil::error(
"Error in XmlRpcClient::readHeader: error while reading header (%s) on fd %d.",
309 char *hp = (
char*)
_header.c_str();
310 char *ep = hp +
_header.length();
314 for (
char *cp = hp; (bp == 0) && (cp < ep); ++cp) {
315 if ((ep - cp > 16) && (strncasecmp(cp,
"Content-length: ", 16) == 0))
317 else if ((ep - cp > 4) && (strncmp(cp,
"\r\n\r\n", 4) == 0))
319 else if ((ep - cp > 2) && (strncmp(cp,
"\n\n", 2) == 0))
327 XmlRpcUtil::error(
"Error in XmlRpcClient::readHeader: EOF while reading header");
336 XmlRpcUtil::error(
"Error XmlRpcClient::readHeader: No Content-length specified");
369 XmlRpcUtil::error(
"Error in XmlRpcClient::readResponse: EOF while reading response");
393 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s",
_response.c_str());
410 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s",
_response.c_str());
416 return result.
valid();
static const char PARAM_ETAG[]
static const char PARAMS_ETAG[]
static const char REQUEST_END[]
XmlRpcClient(const char *host, int port, const char *uri=0)
bool execute(const char *method, XmlRpcValue const ¶ms, XmlRpcValue &result)
virtual std::string generateHeader(std::string const &body)
virtual void close()
Close the connection.
static const char REQUEST_END_METHODNAME[]
ClientConnectionState _connectionState
virtual bool parseResponse(XmlRpcValue &result)
static const char REQUEST_BEGIN[]
static const char PARAM_TAG[]
virtual bool setupConnection()
virtual bool writeRequest()
virtual bool readResponse()
virtual ~XmlRpcClient()
Destructor.
virtual bool readHeader()
static const char METHODRESPONSE_TAG[]
static const char FAULT_TAG[]
static const char PARAMS_TAG[]
virtual bool generateRequest(const char *method, XmlRpcValue const ¶ms)
virtual unsigned handleEvent(unsigned eventType)
void removeSource(XmlRpcSource *source)
@ ReadableEvent
data available to read
@ WritableEvent
connected/data can be written without blocking
void exit()
Exit from work routine.
void addSource(XmlRpcSource *source, unsigned eventMask)
static int socket()
Creates a stream (TCP) socket. Returns -1 on failure.
static bool nbWrite(int socket, std::string &s, int *bytesSoFar)
Write text to the specified socket. Returns false on error.
static bool connect(int socket, std::string &host, int port)
Connect a socket to a server (from a client)
static bool setNonBlocking(int socket)
Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure.
static bool nbRead(int socket, std::string &s, bool *eof)
Read text from the specified socket. Returns false on error.
static std::string getErrorMsg()
Returns message corresponding to last error.
virtual void close()
Close the owned fd. If deleteOnClose was specified at construction, the object is deleted.
int getfd() const
Return the file descriptor being monitored.
void setKeepOpen(bool b=true)
Specify whether the file descriptor should be kept open if it is no longer monitored.
bool getKeepOpen() const
Return whether the file descriptor should be kept open if it is no longer monitored.
void setfd(int fd)
Specify the file descriptor to monitor.
static bool nextTagIs(const char *tag, std::string const &xml, int *offset)
static void error(const char *fmt,...)
Dump error messages somewhere.
static bool findTag(const char *tag, std::string const &xml, int *offset)
Returns true if the tag is found and updates offset to the char after the tag.
static void log(int level, const char *fmt,...)
Dump messages somewhere.
RPC method arguments and results are represented by Values.
int size() const
Return the size for string, base64, array, and struct values.
void clear()
Erase the current value.
bool fromXml(std::string const &valueXml, int *offset)
Decode xml. Destroys any existing value.
bool valid() const
Return true if the value has been set to something.
std::string toXml() const
Encode the Value in xml.
Type const & getType() const
Return the type of the value stored.
const char XMLRPC_VERSION[]
Version identifier.
ClearFlagOnExit(bool &flag)