Skip to content
141 changes: 72 additions & 69 deletions ext/soap/php_http.c

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions ext/soap/php_http.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@
#ifndef PHP_HTTP_H
#define PHP_HTTP_H

int make_http_soap_request(
bool make_http_soap_request(
zval *this_ptr, zend_string *buf, zend_string *location, char *soapaction,
int soap_version, zend_string *uri_parser_class, zval *return_value
);

int proxy_authentication(zval* this_ptr, smart_str* soap_headers);
int basic_authentication(zval* this_ptr, smart_str* soap_headers);
bool proxy_authentication(zval* this_ptr, smart_str* soap_headers);
bool basic_authentication(zval* this_ptr, smart_str* soap_headers);
void http_context_headers(php_stream_context* context,
bool has_authorization,
bool has_proxy_authorization,
Expand Down
53 changes: 27 additions & 26 deletions ext/soap/php_packet_soap.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,25 +39,25 @@ static void master_to_zval_with_doc_cleanup(zval *ret, encodePtr encode, xmlNode
}

/* SOAP client calls this function to parse response from SOAP server */
bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval *return_value, zval *soap_headers)
bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, zval *return_value, zval *soap_headers)
{
char* envelope_ns = NULL;
const char *envelope_ns = NULL;
xmlDocPtr response;
xmlNodePtr trav, env, head, body, resp, cur, fault;
xmlNodePtr trav, env, head, body, resp, fault;
xmlAttrPtr attr;
int param_count = 0;
uint32_t param_count = 0;
int soap_version = SOAP_1_1;
HashTable *hdrs = NULL;

ZVAL_NULL(return_value);

/* Response for one-way operation */
if (buffer_size == 0) {
if (ZSTR_LEN(buffer) == 0) {
return true;
}

/* Parse XML packet */
response = soap_xmlParseMemory(buffer, buffer_size);
response = soap_xmlParseMemory(ZSTR_VAL(buffer), ZSTR_LEN(buffer));

if (!response) {
add_soap_fault(this_ptr, "Client", "looks like we got no XML document", NULL, NULL, soap_lang_en);
Expand Down Expand Up @@ -107,7 +107,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
add_soap_fault(this_ptr, "Client", "encodingStyle cannot be specified on the Envelope", NULL, NULL, soap_lang_en);
xmlFreeDoc(response);
return false;
} else if (strcmp((char*)attr->children->content, SOAP_1_1_ENC_NAMESPACE) != 0) {
} else if (strcmp((const char*)attr->children->content, SOAP_1_1_ENC_NAMESPACE) != 0) {
add_soap_fault(this_ptr, "Client", "Unknown data encoding style", NULL, NULL, soap_lang_en);
xmlFreeDoc(response);
return false;
Expand Down Expand Up @@ -196,7 +196,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
/* Check if <Body> contains <Fault> element */
fault = get_node_ex(body->children,"Fault",envelope_ns);
if (fault != NULL) {
char *faultcode = NULL;
const char *faultcode = NULL;
zend_string *lang = ZSTR_EMPTY_ALLOC();
zend_string *faultstring = NULL, *faultactor = NULL;
zval details;
Expand All @@ -206,7 +206,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
if (soap_version == SOAP_1_1) {
tmp = get_node(fault->children, "faultcode");
if (tmp != NULL && tmp->children != NULL) {
faultcode = (char*)tmp->children->content;
faultcode = (const char*)tmp->children->content;
}

tmp = get_node(fault->children, "faultstring");
Expand Down Expand Up @@ -234,7 +234,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
if (tmp != NULL && tmp->children != NULL) {
tmp = get_node(tmp->children, "Value");
if (tmp != NULL && tmp->children != NULL) {
faultcode = (char*)tmp->children->content;
faultcode = (const char*)tmp->children->content;
}
}

Expand All @@ -261,7 +261,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
master_to_zval_with_doc_cleanup(&details, NULL, tmp, response);
}
}
add_soap_fault(this_ptr, faultcode, faultstring ? ZSTR_VAL(faultstring) : NULL, faultactor ? ZSTR_VAL(faultactor) : NULL, &details, lang);
add_soap_fault(this_ptr, faultcode, faultstring ? ZSTR_VAL(faultstring) : NULL, faultactor, &details, lang);
if (faultstring) {
zend_string_release_ex(faultstring, 0);
}
Expand All @@ -287,16 +287,15 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
/* Function has WSDL description */
sdlParamPtr param = NULL;
xmlNodePtr val = NULL;
char *name, *ns = NULL;
zval tmp;
sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes;
int res_count;

hdrs = fnb->output.headers;

if (fn->responseParameters) {
res_count = zend_hash_num_elements(fn->responseParameters);
uint32_t res_count = zend_hash_num_elements(fn->responseParameters);
ZEND_HASH_FOREACH_PTR(fn->responseParameters, param) {
const char *name, *ns = NULL;
if (fnb->style == SOAP_DOCUMENT) {
if (param->element) {
name = param->element->name;
Expand All @@ -314,7 +313,7 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
}

/* Get value of parameter */
cur = get_node_ex(resp, name, ns);
xmlNodePtr cur = get_node_ex(resp, name, ns);
if (!cur) {
cur = get_node(resp, name);
/* TODO: produce warning invalid ns */
Expand Down Expand Up @@ -373,20 +372,22 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
if (val != NULL) {
if (!node_is_equal_ex(val,"result",RPC_SOAP12_NAMESPACE)) {
zval tmp;
zval *arr;

master_to_zval_with_doc_cleanup(&tmp, NULL, val, response);
if (val->name) {
if ((arr = zend_hash_str_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name))) != NULL) {
const char *val_name = (const char*) val->name;
size_t val_name_len = strlen(val_name);
zval *arr = zend_hash_str_find(Z_ARRVAL_P(return_value), val_name, val_name_len);
if (arr != NULL) {
add_next_index_zval(arr, &tmp);
} else if (val->next && get_node(val->next, (char*)val->name)) {
zval arr;
} else if (val->next && get_node(val->next, val_name)) {
zval new_arr;

array_init(&arr);
add_next_index_zval(&arr, &tmp);
add_assoc_zval(return_value, (char*)val->name, &arr);
array_init(&new_arr);
add_next_index_zval(&new_arr, &tmp);
add_assoc_zval_ex(return_value, val_name, val_name_len, &new_arr);
} else {
add_assoc_zval(return_value, (char*)val->name, &tmp);
add_assoc_zval_ex(return_value, val_name, val_name_len, &tmp);
}
} else {
add_next_index_zval(return_value, &tmp);
Expand Down Expand Up @@ -430,18 +431,18 @@ bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctio
sdlSoapBindingFunctionHeaderPtr hdr;

if (trav->ns) {
smart_str_appends(&key, (char*)trav->ns->href);
smart_str_appends(&key, (const char*)trav->ns->href);
smart_str_appendc(&key,':');
}
smart_str_appends(&key, (char*)trav->name);
smart_str_appends(&key, (const char*)trav->name);
smart_str_0(&key);
if ((hdr = zend_hash_find_ptr(hdrs, key.s)) != NULL) {
enc = hdr->encode;
}
smart_str_free(&key);
}
master_to_zval_with_doc_cleanup(&val, enc, trav, response);
add_assoc_zval(soap_headers, (char*)trav->name, &val);
add_assoc_zval(soap_headers, (const char*)trav->name, &val);
}
trav = trav->next;
}
Expand Down
2 changes: 1 addition & 1 deletion ext/soap/php_packet_soap.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@
#ifndef PHP_PACKET_SOAP_H
#define PHP_PACKET_SOAP_H

bool parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunctionPtr fn, char *fn_name, zval *return_value, zval *soap_headers);
bool parse_packet_soap(zval *this_ptr, zend_string *buffer, sdlFunctionPtr fn, zval *return_value, zval *soap_headers);

#endif
2 changes: 1 addition & 1 deletion ext/soap/php_soap.h
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ extern zend_class_entry* soap_sdl_class_entry;

extern HashTable php_soap_defEncNs, php_soap_defEnc, php_soap_defEncIndex;

void add_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail, zend_string *lang);
void add_soap_fault(zval *obj, const char *fault_code, const char *fault_string, zend_string *fault_actor, zval *fault_detail, zend_string *lang);

#define soap_error0(severity, format) \
php_error(severity, "SOAP-ERROR: " format)
Expand Down
26 changes: 13 additions & 13 deletions ext/soap/php_xml.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,55 +148,55 @@ xmlNsPtr node_find_ns(xmlNodePtr node)
}
}

int attr_is_equal_ex(xmlAttrPtr node, const char *name, const char *ns)
bool attr_is_equal_ex(xmlAttrPtr node, const char *name, const char *ns)
{
if (node->name && strcmp((const char *) node->name, name) == 0) {
xmlNsPtr nsPtr = node->ns;
if (ns) {
if (nsPtr) {
return (strcmp((const char *) nsPtr->href, ns) == 0);
} else {
return FALSE;
return false;
}
} else if (nsPtr) {
return FALSE;
return false;
}
return TRUE;
return true;
}
return FALSE;
return false;
}

int node_is_equal_ex(xmlNodePtr node, const char *name, const char *ns)
bool node_is_equal_ex(xmlNodePtr node, const char *name, const char *ns)
{
if (name == NULL || ((node->name) && strcmp((char*)node->name, name) == 0)) {
if (ns) {
xmlNsPtr nsPtr = node_find_ns(node);
if (nsPtr) {
return strcmp((const char *) nsPtr->href, ns) == 0;
} else {
return FALSE;
return false;
}
}
return TRUE;
return true;
}
return FALSE;
return false;
}

int node_is_equal_ex_one_of(xmlNodePtr node, const char *name, const char *const *namespaces)
bool node_is_equal_ex_one_of(xmlNodePtr node, const char *name, const char *const *namespaces)
{
if ((node->name) && strcmp((char*)node->name, name) == 0) {
xmlNsPtr nsPtr = node_find_ns(node);
if (nsPtr) {
do {
if (strcmp((const char *) nsPtr->href, *namespaces) == 0) {
return TRUE;
return true;
}
namespaces++;
} while (*namespaces != NULL);
}
return FALSE;
return false;
}
return FALSE;
return false;
}

xmlAttrPtr get_attribute_any_ns(xmlAttrPtr node, const char *name)
Expand Down
6 changes: 3 additions & 3 deletions ext/soap/php_xml.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ xmlDocPtr soap_xmlParseFile(const char *filename);
xmlDocPtr soap_xmlParseMemory(const void *buf, size_t size);

xmlNsPtr node_find_ns(xmlNodePtr node);
int attr_is_equal_ex(xmlAttrPtr node, const char *name, const char *ns);
int node_is_equal_ex(xmlNodePtr node, const char *name, const char *ns);
int node_is_equal_ex_one_of(xmlNodePtr node, const char *name, const char *const *namespaces);
bool attr_is_equal_ex(xmlAttrPtr node, const char *name, const char *ns);
bool node_is_equal_ex(xmlNodePtr node, const char *name, const char *ns);
bool node_is_equal_ex_one_of(xmlNodePtr node, const char *name, const char *const *namespaces);
xmlAttrPtr get_attribute_any_ns(xmlAttrPtr node, const char *name);
xmlAttrPtr get_attribute_ex(xmlAttrPtr node, const char *name, const char *ns);
xmlNodePtr get_node_ex(xmlNodePtr node, const char *name, const char *ns);
Expand Down
Loading
Loading