diff options
author | Dmitry Stogov <dmitry@php.net> | 2004-02-04 14:46:12 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2004-02-04 14:46:12 +0000 |
commit | 9fa7d1c24aa8dd6130179da2eb2e0b37b6e4fd8d (patch) | |
tree | 4066be9017b4609b6de1f903aad3ddbfec69d11f /ext/soap/php_packet_soap.c | |
parent | 3df50001e132d2c634cebb2c336654c3211dac44 (diff) | |
download | php-git-9fa7d1c24aa8dd6130179da2eb2e0b37b6e4fd8d.tar.gz |
SOAP Headers was implemented (near complete)
Diffstat (limited to 'ext/soap/php_packet_soap.c')
-rw-r--r-- | ext/soap/php_packet_soap.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/ext/soap/php_packet_soap.c b/ext/soap/php_packet_soap.c index 84a0c5d75e..1df72f66ce 100644 --- a/ext/soap/php_packet_soap.c +++ b/ext/soap/php_packet_soap.c @@ -31,6 +31,7 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction int param_count = 0; int old_error_reporting; int soap_version; + HashTable *hdrs = NULL; ZVAL_NULL(return_value); @@ -177,17 +178,6 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction } } - if (soap_headers && head) { - trav = head->children; - while (trav != NULL) { - if (trav->type == XML_ELEMENT_NODE) { - zval *val = master_to_zval(NULL, trav); - add_assoc_zval(soap_headers, (char*)trav->name, val); - } - trav = trav->next; - } - } - /* Check if <Body> contains <Fault> element */ fault = get_node_ex(body->children,"Fault",envelope_ns); if (fault != NULL) { @@ -259,6 +249,8 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)fn->bindingAttributes; int res_count = zend_hash_num_elements(fn->responseParameters); + hdrs = fnb->output.headers; + zend_hash_internal_pointer_reset(fn->responseParameters); while (zend_hash_get_current_data(fn->responseParameters, (void **)&h_param) == SUCCESS) { param = (*h_param); @@ -352,6 +344,35 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction } } + if (soap_headers && head) { + trav = head->children; + while (trav != NULL) { + if (trav->type == XML_ELEMENT_NODE) { + encodePtr enc = NULL; + zval* val; + + if (hdrs) { + smart_str key = {0}; + sdlSoapBindingFunctionHeaderPtr *hdr; + + if (trav->ns) { + smart_str_appends(&key,trav->ns->href); + smart_str_appendc(&key,':'); + } + smart_str_appends(&key,trav->name); + smart_str_0(&key); + if (zend_hash_find(hdrs, key.c, key.len+1, (void**)&hdr) == SUCCESS) { + enc = (*hdr)->encode; + } + smart_str_free(&key); + } + val = master_to_zval(enc, trav); + add_assoc_zval(soap_headers, (char*)trav->name, val); + } + trav = trav->next; + } + } + xmlFreeDoc(response); return TRUE; } |