20 "<?xml version=\"1.0\"?>\r\n" 21 "<methodCall><methodName>";
35 return "NO_CONNECTION";
39 return "WRITE_REQUEST";
43 return "READ_RESPONSE";
62 XmlRpcUtil::log(1,
"XmlRpcClient new client: host %s, port %d.", host, port);
126 double msTime = -1.0;
132 XmlRpcUtil::log(1,
"XmlRpcClient::execute: method %s completed.", method);
199 XmlRpcUtil::error(
"Error in XmlRpcClient::handleEvent: could not connect to server (%s).",
289 if (params.
valid()) {
293 for (
int i=0; i<params.
size(); ++i) {
295 body += params[i].
toXml();
302 body += params.
toXml();
311 XmlRpcUtil::log(4,
"XmlRpcClient::generateRequest: header is %d bytes, content-length is %d.",
312 header.length(), body.length());
323 "POST " +
_uri +
" HTTP/1.1\r\n" 326 header +=
"\r\nHost: ";
330 snprintf(buff,40,
":%d\r\n",
_port);
333 header +=
"Content-Type: text/xml\r\nContent-length: ";
335 snprintf(buff,40,
"%zu\r\n\r\n", length);
337 return header + buff;
390 "header (%s) on fd %d.",
400 char *hp = (
char*)
_header.c_str();
401 char *ep = hp +
_header.length();
405 for (
char *cp = hp; (bp == 0) && (cp < ep); ++cp) {
406 if ((ep - cp > 16) && (strncasecmp(cp,
"Content-length: ", 16) == 0))
408 else if ((ep - cp > 4) && (strncmp(cp,
"\r\n\r\n", 4) == 0))
410 else if ((ep - cp > 2) && (strncmp(cp,
"\n\n", 2) == 0))
418 XmlRpcUtil::error(
"Error in XmlRpcClient::readHeader: EOF while reading header");
428 XmlRpcUtil::error(
"Error XmlRpcClient::readHeader: No Content-length specified");
470 XmlRpcUtil::error(
"Error in XmlRpcClient::readResponse: EOF while reading response");
497 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s",
_response.c_str());
512 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s",
_response.c_str());
518 return result.
valid();
static const char REQUEST_BEGIN[]
virtual bool generateRequest(const char *method, XmlRpcValue const ¶ms)
bool getKeepOpen() const
Return whether the file descriptor should be kept open if it is no longer monitored.
virtual bool parseResponse(XmlRpcValue &result)
RPC method arguments and results are represented by Values.
const char XMLRPC_VERSION[]
Version identifier.
connected/data can be written without blocking
static const char PARAMS_TAG[]
int size() const
Return the size for string, base64, array, and struct values.
virtual bool readHeader()
bool valid() const
Return true if the value has been set to something.
void removeSource(XmlRpcSource *source)
static const char REQUEST_END[]
void setKeepOpen(bool b=true)
Specify whether the file descriptor should be kept open if it is no longer monitored.
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 bool nbRead(int socket, std::string &s, bool *eof)
Read text from the specified socket. Returns false on error.
Type const & getType() const
Return the type of the value stored.
void clear()
Erase the current value.
static std::string getErrorMsg()
Returns message corresponding to last error.
virtual void close()
Close the connection.
static const char PARAM_ETAG[]
static bool nbWrite(int socket, const std::string &s, int *bytesSoFar)
Write text to the specified socket. Returns false on error.
static const char REQUEST_END_METHODNAME[]
int getfd() const
Return the file descriptor being monitored.
ClientConnectionState _connectionState
virtual void close()
Close the owned fd. If deleteOnClose was specified at construction, the object is deleted...
void setfd(int fd)
Specify the file descriptor to monitor.
std::string toXml() const
Encode the Value in xml.
static bool connect(int socket, const std::string &host, int port)
Connect a socket to a server (from a client)
static const char PARAMS_ETAG[]
XmlRpcClient(const char *host, int port, const char *uri=0)
virtual ~XmlRpcClient()
Destructor.
static const char * connectionStateStr(ClientConnectionState state)
static const char PARAM_TAG[]
bool fromXml(std::string const &valueXml, int *offset)
Decode xml. Destroys any existing value.
static int socket()
Creates a stream (TCP) socket. Returns -1 on failure.
virtual std::string generateHeader(size_t length) const
virtual unsigned handleEvent(unsigned eventType)
static const char METHODRESPONSE_TAG[]
bool execute(const char *method, XmlRpcValue const ¶ms, XmlRpcValue &result)
void addSource(XmlRpcSource *source, unsigned eventMask)
bool executeNonBlock(const char *method, XmlRpcValue const ¶ms)
out-of-band data has arrived
void exit()
Exit from work routine.
static bool setNonBlocking(int socket)
Sets a stream (TCP) socket to perform non-blocking IO. Returns false on failure.
virtual bool setupConnection()
virtual bool readResponse()
bool executeCheckDone(XmlRpcValue &result)
virtual bool writeRequest()
static void log(int level, const char *fmt,...)
Dump messages somewhere.
ClearFlagOnExit(bool &flag)
static const char FAULT_TAG[]
static bool nextTagIs(const char *tag, std::string const &xml, int *offset)