21 "<?xml version=\"1.0\"?>\r\n" 22 "<methodCall><methodName>";
36 return "NO_CONNECTION";
40 return "WRITE_REQUEST";
44 return "READ_RESPONSE";
63 XmlRpcUtil::log(1,
"XmlRpcClient new client: host %s, port %d.", host, port);
127 double msTime = -1.0;
138 if (
_header.find(
"HTTP/1.1 200 OK", 0, 15) != 0) {
142 XmlRpcUtil::log(1,
"XmlRpcClient::execute: method %s completed.", method);
210 XmlRpcUtil::error(
"Error in XmlRpcClient::handleEvent: could not connect to server (%s).",
300 if (params.
valid()) {
304 for (
int i=0; i<params.
size(); ++i) {
306 body += params[i].
toXml();
313 body += params.
toXml();
322 XmlRpcUtil::log(4,
"XmlRpcClient::generateRequest: header is %d bytes, content-length is %d.",
323 header.length(), body.length());
327 if (_request.length() > size_t(INT_MAX)) {
328 XmlRpcUtil::error(
"XmlRpcClient::generateRequest: request length (%u) exceeds maximum allowed size (%u).",
329 _request.length(), INT_MAX);
341 "POST " +
_uri +
" HTTP/1.1\r\n" 344 header +=
"\r\nHost: ";
348 std::snprintf(buff,40,
":%d\r\n",
_port);
351 header +=
"Content-Type: text/xml\r\nContent-length: ";
353 std::snprintf(buff,40,
"%zu\r\n\r\n", length);
355 return header + buff;
408 "header (%s) on fd %d.",
418 char *hp = (
char*)
_header.c_str();
419 char *ep = hp +
_header.length();
423 for (
char *cp = hp; (bp == 0) && (cp < ep); ++cp) {
424 if ((ep - cp > 16) && (strncasecmp(cp,
"Content-length: ", 16) == 0))
426 else if ((ep - cp > 4) && (strncmp(cp,
"\r\n\r\n", 4) == 0))
428 else if ((ep - cp > 2) && (strncmp(cp,
"\n\n", 2) == 0))
436 XmlRpcUtil::error(
"Error in XmlRpcClient::readHeader: EOF while reading header");
446 XmlRpcUtil::error(
"Error XmlRpcClient::readHeader: No Content-length specified");
453 long int clength = 0;
454 clength = strtol(lp,
nullptr, 10);
455 if ((clength <= 0) || (clength > INT_MAX)) {
456 XmlRpcUtil::error(
"Error in XmlRpcClient::readHeader: Invalid Content-length specified.");
488 if (
_response.length() > size_t(INT_MAX)) {
489 XmlRpcUtil::error(
"XmlRpcClient::readResponse: response length (%u) exceeds the maximum allowed size (%u).",
498 XmlRpcUtil::error(
"Error in XmlRpcClient::readResponse: EOF while reading response");
525 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no methodResponse. Response:\n%s",
_response.c_str());
540 XmlRpcUtil::error(
"Error in XmlRpcClient::parseResponse: Invalid response - no param or fault tag. Response:\n%s",
_response.c_str());
546 return result.
valid();
static const char REQUEST_BEGIN[]
virtual bool generateRequest(const char *method, XmlRpcValue const ¶ms)
virtual bool parseResponse(XmlRpcValue &result)
int getfd() const
Return the file descriptor being monitored.
int size() const
Return the size for string, base64, array, and struct values.
RPC method arguments and results are represented by Values.
XMLRPCPP_DECL const char XMLRPC_VERSION[]
Version identifier.
connected/data can be written without blocking
static const char PARAMS_TAG[]
virtual bool readHeader()
void removeSource(XmlRpcSource *source)
static const char REQUEST_END[]
bool valid() const
Return true if the value has been set to something.
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.
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[]
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.
Type const & getType() const
Return the type of the value stored.
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 unsigned handleEvent(unsigned eventType)
std::string toXml() const
Encode the Value in xml.
static const char METHODRESPONSE_TAG[]
bool execute(const char *method, XmlRpcValue const ¶ms, XmlRpcValue &result)
virtual std::string generateHeader(size_t length) const
void addSource(XmlRpcSource *source, unsigned eventMask)
bool getKeepOpen() const
Return whether the file descriptor should be kept open if it is no longer monitored.
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)