69 #include <libxml/xmlmemory.h> 70 #include <libxml/tree.h> 71 #include <libxml/debugXML.h> 72 #include <libxml/encoding.h> 77 #define XR_ENABLE_EMPTY_STRING_VALUES 79 #define OPTIMAL_STRUCT_SIZE 7 168 {
"DATETIME.ISO8601",
xr_date },
195 #define NUMBER_OF_METHODCALL_ELEMENTS \ 196 sizeof(methodcall_elements)/sizeof(methodcall_elements[0]) 197 #define NUMBER_OF_METHODRESPONSE_ELEMENTS \ 198 sizeof(methodresponse_elements)/sizeof(methodresponse_elements[0]) 199 #define NUMBER_OF_PARAMS_ELEMENTS \ 200 sizeof(params_elements)/sizeof(params_elements[0]) 201 #define NUMBER_OF_PARAM_ELEMENTS \ 202 sizeof(param_elements)/sizeof(param_elements[0]) 203 #define NUMBER_OF_VALUE_ELEMENTS \ 204 sizeof(value_elements)/sizeof(value_elements[0]) 205 #define NUMBER_OF_STRUCT_ELEMENTS \ 206 sizeof(struct_elements)/sizeof(struct_elements[0]) 207 #define NUMBER_OF_MEMBER_ELEMENTS \ 208 sizeof(member_elements)/sizeof(member_elements[0]) 209 #define NUMBER_OF_ARRAY_ELEMENTS \ 210 sizeof(array_elements)/sizeof(array_elements[0]) 211 #define NUMBER_OF_DATA_ELEMENTS \ 212 sizeof(data_elements)/sizeof(data_elements[0]) 213 #define NUMBER_OF_FAULT_ELEMENTS \ 214 sizeof(fault_elements)/sizeof(fault_elements[0]) 236 List *params,
int *n);
297 if (
method == NULL || value == NULL)
314 "%*s<methodName>%S</methodName>\n",
324 if (os_value == NULL) {
325 error(0,
"XMLRPC: Could not print method call, param %ld malformed", i);
330 level + 4,
"", os_value, level + 4,
"");
358 if (fault == NULL)
return;
366 if (fault == NULL)
return -1;
373 if (fault == NULL)
return NULL;
382 if (fault == NULL)
return NULL;
387 "%*s<name>faultCode</name>\n" 388 "%*s<value><int>%ld</int></value>\n" 391 "%*s<name>faultString</name>\n" 392 "%*s<value><string>%S</string></value>\n" 395 "%*s</value>\n%*s</fault>\n",
396 level,
"", level+2,
"", level+4,
"", level+6,
"",
397 level+8,
"", level+8,
"",
399 level+6,
"", level+6,
"", level+8,
"", level+8,
"",
401 level+6,
"", level+4,
"", level+2,
"", level,
"");
435 if (
response == NULL || value == NULL)
439 error(0,
"XMLRPC: Method Response may contain only one param.");
443 error(0,
"XMLRPC: Fault Response may not contain any param.");
462 error(0,
"XMLRPC response is not fault response.");
472 error(0,
"XMLRPC response is not fault response.");
482 Octstr *body = NULL, *os_value = NULL;
488 "%*s<params>\n%*s<param>\n" 490 "%*s</param>\n%*s</params>\n" 491 "%*s</methodResponse>\n",
492 level,
"", level+2,
"", level+4,
"", os_value,
493 level+4,
"", level+2,
"", level,
"");
500 "%*s</methodResponse>\n",
501 level,
"", os_value, level,
"");
568 if (post_body == NULL) {
581 pDoc = xmlParseMemory(body,
size);
599 if (xrdoc->
d_type != d_type)
600 warning(0,
"Destroying document with different type then given.");
618 error(0,
"Wrong xmlrpc document type. Param not added.");
630 error(0,
"Unknown xmlrpc document type. Param not added.");
656 Octstr *body = NULL, *pref = NULL;
661 if (xrdoc->
d_type != d_type) {
662 error(0,
"Wrong xmlrpc document type.");
672 error(0,
"Unknown xmlrpc document type.");
676 pref =
octstr_format(
"%*s<?xml version=\"1.0\"?>\n", level,
"");
690 if (http_ref == NULL || xrdoc == NULL)
693 if (xrdoc->
d_type != d_type) {
694 error(0,
"Wrong xmlrpc document type.");
712 url, headers, body, 0, ref, NULL);
778 error(0,
"XMLRPC: value type not supported.");
801 error(0,
"XMLRPC: value type not supported.");
838 error(0,
"XMLRPC: value type not supported.");
845 Octstr *body = NULL, *os = NULL;
866 level,
"", os, level,
"");
888 scalar->
s_str = NULL;
893 #ifdef XR_ENABLE_EMPTY_STRING_VALUES 896 error(0,
"XML-RPC: scalar value may not be null!");
899 #ifdef XR_ENABLE_EMPTY_STRING_VALUES 906 scalar->
s_int = *(
long*)arg;
910 scalar->
s_bool = *(
int*)arg;
926 error(0,
"XML-RPC: scalar type not supported!");
958 if (scalar->
s_type != s_type) {
959 error(0,
"XMLRPC: Scalar content request with bogus type");
970 error(0,
"XML-RPC: scalar type not supported!");
985 level,
"", scalar->
s_int);
989 level,
"", scalar->
s_bool);
996 if (scalar->
s_str == NULL) {
997 #ifdef XR_ENABLE_EMPTY_STRING_VALUES 1010 os =
octstr_format(
"%*s<datetime.iso8601>%S</datetime.iso8601>\n",
1011 level,
"", scalar->
s_date);
1031 member->
name = NULL;
1032 member->
value = NULL;
1044 if (destroy_value == 1)
1058 if (call == NULL || call->
methodcall == NULL)
1124 ||
name == NULL || value == NULL)
1166 Octstr *body, *os_val, *key;
1177 member_val =
dict_get(v_struct, key);
1179 if (os_val == NULL) {
1186 "%*s<name>%S</name>\n%S" 1188 level+2,
"", level+4,
"",
1220 if (xrarray == NULL || xrarray->
v_type !=
xr_array || value == NULL)
1263 Octstr *body, *os_element;
1267 if (v_array == NULL)
1270 body =
octstr_format(
"%*s<array>\n%*s<data>\n", level,
"", level+2,
"");
1275 if (os_element == NULL) {
1284 level+2,
"", level,
"");
1328 error(0,
"XMLRPC object is not fault response.");
1338 error(0,
"XMLRPC object is not fault response.");
1375 node = xmlDocGetRootElement(document);
1380 if (node == NULL || node->name == NULL) {
1381 error(0,
"XMLRPC: XML document - not valid root node!");
1434 "methodCall" :
"methodResponse"));
1446 switch (node->type) {
1448 case XML_ELEMENT_NODE:
1454 case XML_COMMENT_NODE:
1465 "in the XML-RPC source.");
1470 if (node->next != NULL)
1480 xmlChar *content_buff;
1486 if (node->name == NULL) {
1487 error(0,
"XMLRPC: XML methodcall element nodes without name!");
1525 content_buff = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
1526 if (content_buff != NULL) {
1528 xmlFree(content_buff);
1532 "at level <methodCall>");
1538 "at level <methodCall>");
1558 switch (node->type) {
1560 case XML_ELEMENT_NODE:
1564 "in the XML-RPC source.", node->name);
1572 case XML_COMMENT_NODE:
1583 "in the XML-RPC source.");
1588 if (node->next != NULL) {
1607 if (node->name == NULL) {
1608 error(0,
"XMLRPC: XML methodResponse element nodes without name!");
1645 return parse_fault(doc, node->xmlChildrenNode, xrdoc, methodresponse->
fault);
1653 if (
status < 0)
return -1;
1657 "at level <methodResponse>");
1674 switch (node->type) {
1676 case XML_ELEMENT_NODE:
1681 case XML_COMMENT_NODE:
1696 if (node->next != NULL)
1697 if (
parse_params(doc, node->next, xrdoc, params) == -1)
1714 if (node->name == NULL) {
1715 error(0,
"XMLRPC: XML params element nodes without name!");
1736 "in XML source at level <params>",
1751 if (
parse_param(doc, node->xmlChildrenNode, xrdoc, params, &n) == -1)
1768 switch (node->type) {
1770 case XML_ELEMENT_NODE:
1784 case XML_COMMENT_NODE:
1799 if (node->next != NULL)
1800 if (
parse_param(doc, node->next, xrdoc, params, n) == -1)
1816 if (node->name == NULL) {
1817 error(0,
"XMLRPC: XML param element nodes without name!");
1838 "in XML source at level <param>",
1854 if (
parse_value(doc, node->xmlChildrenNode, xrdoc, value) == -1) {
1874 switch (node->type) {
1876 case XML_ELEMENT_NODE:
1881 case XML_COMMENT_NODE:
1896 if (node->next != NULL)
1897 if (
parse_value(doc, node->next, xrdoc, value) == -1)
1908 xmlChar *content_buff;
1916 if (node->name == NULL) {
1917 error(0,
"XMLRPC: XML value element nodes without name!");
1938 "in XML source at level <value>",
1946 content_buff = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
1947 if (content_buff != NULL) {
1949 xmlFree(content_buff);
1972 #ifndef XR_ENABLE_EMPTY_STRING_VALUES 1975 if (value == NULL) {
2081 switch (node->type) {
2083 case XML_ELEMENT_NODE:
2088 case XML_COMMENT_NODE:
2103 if (node->next != NULL)
2104 if (
parse_struct(doc, node->next, xrdoc, members) == -1)
2120 if (node->name == NULL) {
2121 error(0,
"XMLRPC: XML struct element nodes without name!");
2142 "in XML source at level <struct>",
2158 if (
parse_member(doc, node->xmlChildrenNode, xrdoc, member) == -1) {
2184 switch (node->type) {
2186 case XML_ELEMENT_NODE:
2191 case XML_COMMENT_NODE:
2206 if (node->next != NULL)
2207 if (
parse_member(doc, node->next, xrdoc, member) == -1)
2217 xmlChar *content_buff;
2223 if (node->name == NULL) {
2224 error(0,
"XMLRPC: XML member element nodes without name!");
2245 "in XML source at level <member>",
2261 if (member->
name != NULL) {
2264 "in XML source at level <member>");
2267 content_buff = xmlNodeListGetString(doc, node->xmlChildrenNode, 1);
2268 if (content_buff != NULL) {
2270 xmlFree(content_buff);
2274 "at level <member>");
2281 member->
value = NULL;
2297 switch (node->type) {
2299 case XML_ELEMENT_NODE:
2304 case XML_COMMENT_NODE:
2319 if (node->next != NULL)
2320 if (
parse_array(doc, node->next, xrdoc, elements) == -1)
2335 if (node->name == NULL) {
2336 error(0,
"XMLRPC: XML array element nodes without name!");
2357 "in XML source at level <array>",
2372 if (
parse_data(doc, node->xmlChildrenNode, xrdoc, elements) == -1)
2390 switch (node->type) {
2392 case XML_ELEMENT_NODE:
2397 case XML_COMMENT_NODE:
2412 if (node->next != NULL)
2413 if (
parse_data(doc, node->next, xrdoc, elements) == -1)
2429 if (node->name == NULL) {
2430 error(0,
"XMLRPC: XML data element nodes without name!");
2451 "in XML source at level <data>",
2467 if (
parse_value(doc, node->xmlChildrenNode, xrdoc, value) == -1) {
2488 switch (node->type) {
2490 case XML_ELEMENT_NODE:
2495 case XML_COMMENT_NODE:
2510 if (node->next != NULL)
2511 if (
parse_fault(doc, node->next, xrdoc, fault) == -1)
2527 if (node->name == NULL) {
2528 error(0,
"XMLRPC: XML fault element nodes without name!");
2549 "in XML source at level <fault>",
2565 if (
parse_value(doc, node->xmlChildrenNode, xrdoc, value) == -1) {
2590 "in XML source at level <fault>");
2602 "in XML source at level <member>");
static void xmlrpc_call_destroy(XMLRPCMethodCall *call)
Dict * dict_create(long size_hint, void(*destroy_value)(void *))
static int xmlrpc_response_is_fault(XMLRPCMethodResponse *response)
void error(int err, const char *fmt,...)
Octstr * xmlrpc_value_print(XMLRPCValue *val, int level)
static int parse_methodresponse(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMethodResponse *methodresponse, int *n)
XMLRPCValue * xmlrpc_create_string_value(Octstr *val)
XMLRPCDocument * xmlrpc_doc_create_response(void)
static int parse_array_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *elements)
int xmlrpc_is_fault(XMLRPCDocument *response)
int xmlrpc_add_member(XMLRPCValue *xrstruct, Octstr *name, XMLRPCValue *value)
static void xmlrpc_response_destroy(XMLRPCMethodResponse *response)
void http_header_add(List *headers, char *name, char *contents)
static int parse_data(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *elements)
void gwlist_append(List *list, void *item)
static Octstr * xmlrpc_call_get_name(XMLRPCMethodCall *call)
int xmlrpc_value_get_type_smart(XMLRPCValue *val)
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
void gwlist_produce(List *list, void *item)
long gwlist_len(List *list)
static void xmlrpc_fault_destroy(XMLRPCFault *fault)
static int parse_document(xmlDocPtr document, XMLRPCDocument *xrdoc)
static int parse_struct(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, Dict *members)
static XMLRPCMethodCall * xmlrpc_call_create(Octstr *name)
void * gwlist_get(List *list, long pos)
static int parse_fault_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCFault *fault)
#define NUMBER_OF_VALUE_ELEMENTS
static int parse_value_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCValue *xrvalue)
Octstr * xmlrpc_scalar_print(XMLRPCScalar *scalar, int level)
XMLRPCValue * xmlrpc_value_create(void)
#define xmlrpc_scalar_get_int(scalar)
static void xmlrpc_member_destroy(XMLRPCMember *member, int destroy_value)
static XMLRPCMethodResponse * xmlrpc_response_create(void)
void * xmlrpc_get_element_content(XMLRPCValue *xrarray, int i)
void xmlrpc_value_destroy_item(void *val)
Octstr * xmlrpc_print_array(List *v_array, int level)
XMLRPCMethodResponse * methodresponse
#define NUMBER_OF_PARAMS_ELEMENTS
static int parse_params(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *params)
int xmlrpc_add_element_scalar(XMLRPCValue *xrarray, int type, void *arg)
void xmlrpc_scalar_destroy(XMLRPCScalar *scalar)
void octstr_convert_to_html_entities(Octstr *input)
void octstr_strip_blanks(Octstr *text)
int xmlrpc_value_get_type(XMLRPCValue *val)
XMLRPCMethodCall * methodcall
long xmlrpc_get_faultcode(XMLRPCDocument *faultresponse)
#define octstr_get_cstr(ostr)
#define NUMBER_OF_FAULT_ELEMENTS
int xmlrpc_parse_status(XMLRPCDocument *xrdoc)
static int parse_methodcall_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMethodCall *methodcall)
#define OPTIMAL_STRUCT_SIZE
XMLRPCValue * xmlrpc_get_element(XMLRPCValue *xrarray, int i)
Octstr * xmlrpc_doc_print(XMLRPCDocument *xrdoc, int d_type, int level)
static int parse_params_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *params)
Octstr * xmlrpc_get_faultstring(XMLRPCDocument *faultresponse)
long octstr_parse_double(double *nump, Octstr *ostr, long pos)
static int parse_array(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *elements)
static int parse_struct_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, Dict *members)
static int parse_data_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *elements)
static int parse_methodresponse_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMethodResponse *methodresponse)
void gwlist_unlock(List *list)
void http_start_request(HTTPCaller *caller, int method, Octstr *url, List *headers, Octstr *body, int follow, void *id, Octstr *certkeyfile)
static int xmlrpc_call_add_param(XMLRPCMethodCall *method, XMLRPCValue *value)
XMLRPCValue * xmlrpc_create_scalar_value(int type, void *arg)
static Octstr * xmlrpc_fault_get_string(XMLRPCFault *fault)
Octstr * octstr_imm(const char *cstr)
int xmlrpc_doc_add_value(XMLRPCDocument *xrdoc, int d_type, XMLRPCValue *value)
void octstr_insert(Octstr *ostr1, const Octstr *ostr2, long pos)
#define xmlrpc_get_scalar_value_type(value)
static int parse_param_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *params)
static int parse_member(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMember *member)
void * dict_get(Dict *dict, Octstr *key)
static xmlrpc_table_t array_elements[]
#define NUMBER_OF_STRUCT_ELEMENTS
void xmlrpc_value_destroy(XMLRPCValue *val)
XMLRPCDocument * xmlrpc_doc_create(void)
int xmlrpc_get_element_type(XMLRPCValue *xrarray, int i)
static xmlrpc_table_t struct_elements[]
#define octstr_duplicate(ostr)
int xmlrpc_count_elements(XMLRPCValue *xrarray)
long dict_key_count(Dict *dict)
XMLRPCDocument * xmlrpc_doc_parse(Octstr *post_body, int d_type)
static xmlrpc_table_t methodcall_elements[]
void * xmlrpc_scalar_get_content(XMLRPCScalar *scalar, int s_type)
int octstr_case_compare(const Octstr *os1, const Octstr *os2)
void * xmlrpc_value_get_content(XMLRPCValue *val)
void warning(int err, const char *fmt,...)
XMLRPCDocument * xmlrpc_doc_create_call(Octstr *name)
#define NUMBER_OF_MEMBER_ELEMENTS
#define NUMBER_OF_DATA_ELEMENTS
Octstr * xmlrpc_get_call_name(XMLRPCDocument *call)
Octstr * octstr_format(const char *fmt,...)
void octstr_destroy(Octstr *ostr)
long xmlrpc_count_members(XMLRPCValue *xrstruct)
#define octstr_create(cstr)
void octstr_destroy_item(void *os)
static XMLRPCMember * xmlrpc_member_create(void)
int xmlrpc_add_element(XMLRPCValue *xrarray, XMLRPCValue *value)
int xmlrpc_value_set_content(XMLRPCValue *val, void *content)
static xmlrpc_table_t member_elements[]
static int parse_param(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, List *params, int *n)
static long xmlrpc_fault_get_code(XMLRPCFault *fault)
XMLRPCValue * xmlrpc_get_param(XMLRPCDocument *xrdoc, int i)
XMLRPCScalar * xmlrpc_scalar_create(int type, void *arg)
int xmlrpc_doc_add_scalar(XMLRPCDocument *xrdoc, int d_type, int type, void *arg)
#define NUMBER_OF_METHODCALL_ELEMENTS
static int parse_value(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCValue *value)
void gwlist_lock(List *list)
static int xmlrpc_response_add_param(XMLRPCMethodResponse *response, XMLRPCValue *value)
static int parse_fault(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCFault *fault)
long octstr_len(const Octstr *ostr)
static xmlrpc_table_t fault_elements[]
void dict_destroy(Dict *dict)
static int parse_methodcall(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMethodCall *methodcall)
Octstr * xmlrpc_print_struct(Dict *v_struct, int level)
int xmlrpc_doc_send(XMLRPCDocument *xrdoc, int d_type, HTTPCaller *http_ref, Octstr *url, List *headers, void *ref)
static int parse_member_element(xmlDocPtr doc, xmlNodePtr node, XMLRPCDocument *xrdoc, XMLRPCMember *member)
void * gwlist_consume(List *list)
static xmlrpc_table_t methodresponse_elements[]
int xmlrpc_get_member_type(XMLRPCValue *xrstruct, Octstr *name)
XMLRPCValue * xmlrpc_create_struct_value(int count_members)
long http_header_remove_all(List *headers, char *name)
XMLRPCValue * xmlrpc_create_double_value(double val)
long octstr_parse_long(long *nump, Octstr *ostr, long pos, int base)
void * xmlrpc_get_member_content(XMLRPCValue *xrstruct, Octstr *name)
void octstr_format_append(Octstr *os, const char *fmt,...)
static xmlrpc_2table_t value_elements[]
XMLRPCValue * xmlrpc_get_member(XMLRPCValue *xrstruct, Octstr *name)
XMLRPCValue * xmlrpc_create_array_value(void)
#define xmlrpc_scalar_get_string(scalar)
List * dict_keys(Dict *dict)
XMLRPCDocument * xmlrpc_doc_create_faultresponse(long faultcode, Octstr *faultstring)
int xmlrpc_get_type_param(XMLRPCDocument *xrdoc, int i)
void * xmlrpc_get_content_param(XMLRPCDocument *xrdoc, int i)
int dict_put_once(Dict *dict, Octstr *key, void *value)
static Octstr * xmlrpc_fault_print(XMLRPCFault *fault, int level)
static Octstr * xmlrpc_response_get_faultstring(XMLRPCMethodResponse *faultresponse)
int xmlrpc_value_set_type(XMLRPCValue *val, int v_type)
static Octstr * xmlrpc_response_print(XMLRPCMethodResponse *response, int level)
int xmlrpc_add_member_scalar(XMLRPCValue *xrstruct, Octstr *name, int type, void *arg)
static xmlrpc_table_t param_elements[]
static int response(List *push_headers, Octstr **username, Octstr **password)
#define NUMBER_OF_METHODRESPONSE_ELEMENTS
static XMLRPCFault * xmlrpc_fault_create(long fcode, Octstr *fstring)
void octstr_shrink_blanks(Octstr *text)
int xmlrpc_scalar_get_type(XMLRPCScalar *scalar)
#define NUMBER_OF_PARAM_ELEMENTS
static Octstr * xmlrpc_call_print(XMLRPCMethodCall *call, int level)
static xmlrpc_table_t data_elements[]
void xmlrpc_doc_destroy(XMLRPCDocument *xrdoc, int d_type)
XMLRPCValue * xmlrpc_create_int_value(long val)
Octstr * xmlrpc_parse_error(XMLRPCDocument *xrdoc)
static xmlrpc_table_t params_elements[]
#define NUMBER_OF_ARRAY_ELEMENTS
int xmlrpc_count_params(XMLRPCDocument *xrdoc)
static long xmlrpc_response_get_faultcode(XMLRPCMethodResponse *faultresponse)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)