summaryrefslogtreecommitdiff
path: root/ext/soap/php_packet_soap.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2004-02-04 14:46:12 +0000
committerDmitry Stogov <dmitry@php.net>2004-02-04 14:46:12 +0000
commit9fa7d1c24aa8dd6130179da2eb2e0b37b6e4fd8d (patch)
tree4066be9017b4609b6de1f903aad3ddbfec69d11f /ext/soap/php_packet_soap.c
parent3df50001e132d2c634cebb2c336654c3211dac44 (diff)
downloadphp-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.c43
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;
}