dmitry Tue Feb 24 10:06:43 2004 EDT Added files: /php-src/ext/soap/tests/soap12 T63.phpt
Modified files: /php-src/ext/soap TODO php_sdl.c php_sdl.h soap.c /php-src/ext/soap/tests/soap12 soap12-test.inc soap12-test.wsdl Log: WSDL support for <soap:headerfault> was implemented
http://cvs.php.net/diff.php/php-src/ext/soap/TODO?r1=1.46&r2=1.47&ty=u Index: php-src/ext/soap/TODO diff -u php-src/ext/soap/TODO:1.46 php-src/ext/soap/TODO:1.47 --- php-src/ext/soap/TODO:1.46 Tue Feb 24 04:02:33 2004 +++ php-src/ext/soap/TODO Tue Feb 24 10:06:41 2004 @@ -50,7 +50,7 @@ ---- ? server part support for "document" style encoding ? support for <fault>, <soap:fault> -- <soap:headerfault> +? <soap:headerfault> - <soap:body> parts attribute (with MIME/DIME binding) - MIME binding - DIME binding @@ -59,6 +59,7 @@ - function/method overloading/redeclaration (test(int); test(string)) - wsdl auto generation - HTTP GET/POST binding +- SOAP security extension Schema ------ http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.c?r1=1.65&r2=1.66&ty=u Index: php-src/ext/soap/php_sdl.c diff -u php-src/ext/soap/php_sdl.c:1.65 php-src/ext/soap/php_sdl.c:1.66 --- php-src/ext/soap/php_sdl.c:1.65 Thu Feb 19 13:49:50 2004 +++ php-src/ext/soap/php_sdl.c Tue Feb 24 10:06:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.c,v 1.65 2004/02/19 18:49:50 dmitry Exp $ */ +/* $Id: php_sdl.c,v 1.66 2004/02/24 15:06:41 dmitry Exp $ */ #include "php_soap.h" #include "libxml/uri.h" @@ -315,9 +315,117 @@ } } +static sdlSoapBindingFunctionHeaderPtr wsdl_soap_binding_header(sdlCtx* ctx, xmlNodePtr header, char* wsdl_soap_namespace, int fault) +{ + xmlAttrPtr tmp; + xmlNodePtr *message, part; + char *ctype; + sdlSoapBindingFunctionHeaderPtr h; + + tmp = get_attribute(header->properties, "message"); + if (!tmp) { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing message attribute for <header>"); + } + + ctype = strrchr(tmp->children->content,':'); + if (ctype == NULL) { + ctype = tmp->children->content; + } else { + ++ctype; + } + if (zend_hash_find(&ctx->messages, ctype, strlen(ctype)+1, (void**)&message) != SUCCESS) { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", tmp->children->content); + } + + tmp = get_attribute(header->properties, "part"); + if (!tmp) { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing part attribute for <header>"); + } + part = get_node_with_attribute_ex((*message)->children, "part", WSDL_NAMESPACE, "name", tmp->children->content, NULL); + if (!part) { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing part '%s' in <message>",tmp->children->content); + } + + h = emalloc(sizeof(sdlSoapBindingFunctionHeader)); + memset(h, 0, sizeof(sdlSoapBindingFunctionHeader)); + h->name = estrdup(tmp->children->content); + + tmp = get_attribute(header->properties, "use"); + if (tmp && !strncmp(tmp->children->content, "encoded", sizeof("encoded"))) { + h->use = SOAP_ENCODED; + } else { + h->use = SOAP_LITERAL; + } + + tmp = get_attribute(header->properties, "namespace"); + if (tmp) { + h->ns = estrdup(tmp->children->content); + } + + if (h->use == SOAP_ENCODED) { + tmp = get_attribute(header->properties, "encodingStyle"); + if (tmp) { + if (strncmp(tmp->children->content,SOAP_1_1_ENC_NAMESPACE,sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) { + h->encodingStyle = SOAP_ENCODING_1_1; + } else if (strncmp(tmp->children->content,SOAP_1_2_ENC_NAMESPACE,sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) { + h->encodingStyle = SOAP_ENCODING_1_2; + } else { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Unknown encodingStyle '%s'",tmp->children->content); + } + } else { + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Unspecified encodingStyle"); + } + } + + tmp = get_attribute(part->properties, "type"); + if (tmp != NULL) { + h->encode = get_encoder_from_prefix(ctx->sdl, part, tmp->children->content); + } else { + tmp = get_attribute(part->properties, "element"); + if (tmp != NULL) { + h->element = get_element(ctx->sdl, part, tmp->children->content); + if (h->element) { + h->encode = h->element->encode; + if (!h->ns && h->element->namens) { + h->ns = estrdup(h->element->namens); + } + } + } + } + if (!fault) { + xmlNodePtr trav = header->children; + while (trav != NULL) { + if (node_is_equal_ex(trav, "headerfault", wsdl_soap_namespace)) { + sdlSoapBindingFunctionHeaderPtr hf = wsdl_soap_binding_header(ctx, trav, wsdl_soap_namespace, 1); + smart_str key = {0}; + + if (h->headerfaults == NULL) { + h->headerfaults = emalloc(sizeof(HashTable)); + zend_hash_init(h->headerfaults, 0, NULL, delete_header, 0); + } + + if (hf->ns) { + smart_str_appends(&key,hf->ns); + smart_str_appendc(&key,':'); + } + smart_str_appends(&key,hf->name); + smart_str_0(&key); + if (zend_hash_add(h->headerfaults, key.c, key.len+1, (void**)&hf, sizeof(sdlSoapBindingFunctionHeaderPtr), NULL) != SUCCESS) { + delete_header((void**)&hf); + } + smart_str_free(&key); + } else if (is_wsdl_element(trav) && !node_is_equal(trav,"documentation")) { + php_error(E_ERROR,"SOAP-ERROR: Parsing WSDL: Unexpected WSDL element <%s>",trav->name); + } + trav = trav->next; + } + } + return h; +} + static void wsdl_soap_binding_body(sdlCtx* ctx, xmlNodePtr node, char* wsdl_soap_namespace, sdlSoapBindingFunctionBody *binding, HashTable* params) { - xmlNodePtr body, trav, header; + xmlNodePtr body, trav; xmlAttrPtr tmp; trav = node->children; @@ -358,84 +466,9 @@ } } } else if (node_is_equal_ex(trav, "header", wsdl_soap_namespace)) { - xmlAttrPtr tmp; - xmlNodePtr *message, part; - char *ctype; - sdlSoapBindingFunctionHeaderPtr h; + sdlSoapBindingFunctionHeaderPtr h = wsdl_soap_binding_header(ctx, trav, wsdl_soap_namespace, 0); smart_str key = {0}; - header = trav; - tmp = get_attribute(header->properties, "message"); - if (!tmp) { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing message attribute for <header>"); - } - - ctype = strrchr(tmp->children->content,':'); - if (ctype == NULL) { - ctype = tmp->children->content; - } else { - ++ctype; - } - if (zend_hash_find(&ctx->messages, ctype, strlen(ctype)+1, (void**)&message) != SUCCESS) { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", tmp->children->content); - } - - tmp = get_attribute(header->properties, "part"); - if (!tmp) { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing part attribute for <header>"); - } - part = get_node_with_attribute_ex((*message)->children, "part", WSDL_NAMESPACE, "name", tmp->children->content, NULL); - if (!part) { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing part '%s' in <message>",tmp->children->content); - } - - h = emalloc(sizeof(sdlSoapBindingFunctionHeader)); - memset(h, 0, sizeof(sdlSoapBindingFunctionHeader)); - h->name = estrdup(tmp->children->content); - - tmp = get_attribute(header->properties, "use"); - if (tmp && !strncmp(tmp->children->content, "encoded", sizeof("encoded"))) { - h->use = SOAP_ENCODED; - } else { - h->use = SOAP_LITERAL; - } - - tmp = get_attribute(header->properties, "namespace"); - if (tmp) { - h->ns = estrdup(tmp->children->content); - } - - if (h->use == SOAP_ENCODED) { - tmp = get_attribute(header->properties, "encodingStyle"); - if (tmp) { - if (strncmp(tmp->children->content,SOAP_1_1_ENC_NAMESPACE,sizeof(SOAP_1_1_ENC_NAMESPACE)) == 0) { - h->encodingStyle = SOAP_ENCODING_1_1; - } else if (strncmp(tmp->children->content,SOAP_1_2_ENC_NAMESPACE,sizeof(SOAP_1_2_ENC_NAMESPACE)) == 0) { - h->encodingStyle = SOAP_ENCODING_1_2; - } else { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Unknown encodingStyle '%s'",tmp->children->content); - } - } else { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Unspecified encodingStyle"); - } - } - - tmp = get_attribute(part->properties, "type"); - if (tmp != NULL) { - h->encode = get_encoder_from_prefix(ctx->sdl, part, tmp->children->content); - } else { - tmp = get_attribute(part->properties, "element"); - if (tmp != NULL) { - h->element = get_element(ctx->sdl, part, tmp->children->content); - if (h->element) { - h->encode = h->element->encode; - if (!h->ns && h->element->namens) { - h->ns = estrdup(h->element->namens); - } - } - } - } - if (binding->headers == NULL) { binding->headers = emalloc(sizeof(HashTable)); zend_hash_init(binding->headers, 0, NULL, delete_header, 0); @@ -471,7 +504,7 @@ ++ctype; } if (zend_hash_find(&ctx->messages, ctype, strlen(ctype)+1, (void**)&tmp) != SUCCESS) { - php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", message->children->content); + php_error(E_ERROR, "SOAP-ERROR: Parsing WSDL: Missing <message> with name '%s'", message_name); } message = *tmp; @@ -960,7 +993,7 @@ return ctx.sdl; } -#define WSDL_CACHE_VERSION 0x08 +#define WSDL_CACHE_VERSION 0x09 #define WSDL_CACHE_GET(ret,type,buf) memcpy(&ret,*buf,sizeof(type)); *buf += sizeof(type); #define WSDL_CACHE_GET_INT(ret,buf) ret = ((unsigned char)(*buf)[0])|((unsigned char)(*buf)[1]<<8)|((unsigned char)(*buf)[2]<<16)|((int)(*buf)[3]<<24); *buf += 4; @@ -1198,7 +1231,7 @@ static void sdl_deserialize_soap_body(sdlSoapBindingFunctionBodyPtr body, encodePtr *encoders, sdlTypePtr *types, char **in) { - int i, n; + int i, j, n; WSDL_CACHE_GET_1(body->use, sdlEncodingUse, in); if (body->use == SOAP_ENCODED) { @@ -1214,6 +1247,7 @@ zend_hash_init(body->headers, i, NULL, delete_header, 0); while (i > 0) { sdlSoapBindingFunctionHeaderPtr tmp = emalloc(sizeof(sdlSoapBindingFunctionHeader)); + memset(tmp, 0, sizeof(sdlSoapBindingFunctionHeader)); sdl_deserialize_key(body->headers, tmp, in); WSDL_CACHE_GET_1(tmp->use, sdlEncodingUse, in); if (tmp->use == SOAP_ENCODED) { @@ -1228,6 +1262,29 @@ WSDL_CACHE_GET_INT(n, in); tmp->element = types[n]; --i; + WSDL_CACHE_GET_INT(j, in); + if (j > 0) { + tmp->headerfaults = emalloc(sizeof(HashTable)); + zend_hash_init(tmp->headerfaults, i, NULL, delete_header, 0); + while (j > 0) { + sdlSoapBindingFunctionHeaderPtr tmp2 = emalloc(sizeof(sdlSoapBindingFunctionHeader)); + memset(tmp2, 0, sizeof(sdlSoapBindingFunctionHeader)); + sdl_deserialize_key(tmp->headerfaults, tmp2, in); + WSDL_CACHE_GET_1(tmp2->use, sdlEncodingUse, in); + if (tmp2->use == SOAP_ENCODED) { + WSDL_CACHE_GET_1(tmp2->encodingStyle, sdlRpcEncodingStyle, in); + } else { + tmp2->encodingStyle = SOAP_ENCODING_DEFAULT; + } + tmp2->name = sdl_deserialize_string(in); + tmp2->ns = sdl_deserialize_string(in); + WSDL_CACHE_GET_INT(n, in); + tmp->encode = encoders[n]; + WSDL_CACHE_GET_INT(n, in); + tmp->element = types[n]; + --j; + } + } } } } @@ -1776,7 +1833,7 @@ static void sdl_serialize_soap_body(sdlSoapBindingFunctionBodyPtr body, HashTable *tmp_encoders, HashTable *tmp_types, smart_str *out) { - int i; + int i, j; WSDL_CACHE_PUT_1(body->use, out); if (body->use == SOAP_ENCODED) { @@ -1803,6 +1860,28 @@ sdl_serialize_string((*tmp)->ns, out); sdl_serialize_encoder_ref((*tmp)->encode, tmp_encoders, out); sdl_serialize_type_ref((*tmp)->element, tmp_types, out); + if ((*tmp)->headerfaults) { + j = zend_hash_num_elements((*tmp)->headerfaults); + } else { + j = 0; + } + WSDL_CACHE_PUT_INT(j, out); + if (j > 0) { + sdlSoapBindingFunctionHeaderPtr *tmp2; + zend_hash_internal_pointer_reset((*tmp)->headerfaults); + while (zend_hash_get_current_data((*tmp)->headerfaults, (void**)&tmp2) == SUCCESS) { + sdl_serialize_key((*tmp)->headerfaults, out); + WSDL_CACHE_PUT_1((*tmp2)->use, out); + if ((*tmp2)->use == SOAP_ENCODED) { + WSDL_CACHE_PUT_1((*tmp2)->encodingStyle, out); + } + sdl_serialize_string((*tmp2)->name, out); + sdl_serialize_string((*tmp2)->ns, out); + sdl_serialize_encoder_ref((*tmp2)->encode, tmp_encoders, out); + sdl_serialize_type_ref((*tmp2)->element, tmp_types, out); + zend_hash_move_forward((*tmp)->headerfaults); + } + } zend_hash_move_forward(body->headers); } } @@ -2261,6 +2340,10 @@ if (hdr->ns) { efree(hdr->ns); } + if (hdr->headerfaults) { + zend_hash_destroy(hdr->headerfaults); + efree(hdr->headerfaults); + } efree(hdr); } http://cvs.php.net/diff.php/php-src/ext/soap/php_sdl.h?r1=1.30&r2=1.31&ty=u Index: php-src/ext/soap/php_sdl.h diff -u php-src/ext/soap/php_sdl.h:1.30 php-src/ext/soap/php_sdl.h:1.31 --- php-src/ext/soap/php_sdl.h:1.30 Thu Feb 19 03:21:13 2004 +++ php-src/ext/soap/php_sdl.h Tue Feb 24 10:06:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_sdl.h,v 1.30 2004/02/19 08:21:13 dmitry Exp $ */ +/* $Id: php_sdl.h,v 1.31 2004/02/24 15:06:41 dmitry Exp $ */ #ifndef PHP_SDL_H #define PHP_SDL_H @@ -97,6 +97,7 @@ sdlTypePtr element; encodePtr encode; sdlRpcEncodingStyle encodingStyle; /* not implemented yet */ + HashTable *headerfaults; /* array of sdlSoapBindingFunctionHeaderPtr */ } sdlSoapBindingFunctionHeader, *sdlSoapBindingFunctionHeaderPtr; typedef struct _sdlSoapBindingFunctionFault { http://cvs.php.net/diff.php/php-src/ext/soap/soap.c?r1=1.90&r2=1.91&ty=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.90 php-src/ext/soap/soap.c:1.91 --- php-src/ext/soap/soap.c:1.90 Thu Feb 19 11:45:25 2004 +++ php-src/ext/soap/soap.c Tue Feb 24 10:06:41 2004 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.90 2004/02/19 16:45:25 dmitry Exp $ */ +/* $Id: soap.c,v 1.91 2004/02/24 15:06:41 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -50,7 +50,7 @@ static void clear_soap_fault(zval *obj TSRMLS_DC); static void set_soap_fault(zval *obj, char *fault_code, char *fault_string, char *fault_actor, zval *fault_detail, char *name TSRMLS_DC); static void soap_server_fault(char* code, char* string, char *actor, zval* details, char *name TSRMLS_DC); -static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault TSRMLS_DC); +static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeader* hdr TSRMLS_DC); static sdlParamPtr get_param(sdlFunctionPtr function, char *param_name, int index, int); static sdlFunctionPtr get_function(sdlPtr sdl, const char *function_name); @@ -668,18 +668,20 @@ { char *fault_string = NULL, *fault_code = NULL, *fault_actor = NULL, *name = NULL; int fault_string_len, fault_code_len, fault_actor_len, name_len; - zval *details = NULL; + zval *details = NULL, *headerfault = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!z!s", + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!z!s!z", &fault_code, &fault_code_len, &fault_string, &fault_string_len, &fault_actor, &fault_actor_len, - &details, - &name, &name_len) == FAILURE) { + &details, &name, &name_len, &headerfault) == FAILURE) { php_error(E_ERROR, "Invalid arguments to SoapFault constructor"); } set_soap_fault(this_ptr, fault_code, fault_string, fault_actor, details, name TSRMLS_CC); + if (headerfault != NULL) { + add_property_zval(this_ptr, "headerfault", headerfault); + } } #ifdef ZEND_ENGINE_2 @@ -1328,7 +1330,7 @@ if (EG(exception) && Z_TYPE_P(EG(exception)) == IS_OBJECT && Z_OBJCE_P(EG(exception)) == soap_fault_class_entry) { - soap_server_fault_ex(function, EG(exception) TSRMLS_CC); + soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); } #endif zval_dtor(&constructor); @@ -1385,7 +1387,29 @@ call_status = call_user_function(EG(function_table), NULL, &h->function_name, &h->retval, h->num_params, h->parameters TSRMLS_CC); } if (call_status != SUCCESS) { - php_error(E_ERROR, "Function '%s' call failed", Z_STRVAL(function_name)); + php_error(E_ERROR, "Function '%s' call failed", Z_STRVAL(h->function_name)); + } + if (Z_TYPE(h->retval) == IS_OBJECT && + Z_OBJCE(h->retval) == soap_fault_class_entry) { + zval *headerfault = NULL, **tmp; + + if (zend_hash_find(Z_OBJPROP(h->retval), "headerfault", sizeof("headerfault"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) != IS_NULL) { + headerfault = *tmp; + } + soap_server_fault_ex(function, &h->retval, h TSRMLS_CC); +#ifdef ZEND_ENGINE_2 + } else if (EG(exception) && + Z_TYPE_P(EG(exception)) == IS_OBJECT && + Z_OBJCE_P(EG(exception)) == soap_fault_class_entry) { + zval *headerfault = NULL, **tmp; + + if (zend_hash_find(Z_OBJPROP_P(EG(exception)), "headerfault", sizeof("headerfault"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) != IS_NULL) { + headerfault = *tmp; + } + soap_server_fault_ex(function, EG(exception), h TSRMLS_CC); +#endif } } else if (h->mustUnderstand) { soap_server_fault("MustUnderstand","Header not understood", NULL, NULL, NULL TSRMLS_CC); @@ -1413,7 +1437,7 @@ if (EG(exception) && Z_TYPE_P(EG(exception)) == IS_OBJECT && Z_OBJCE_P(EG(exception)) == soap_fault_class_entry) { - soap_server_fault_ex(function, EG(exception) TSRMLS_CC); + soap_server_fault_ex(function, EG(exception), NULL TSRMLS_CC); } #endif if (call_status == SUCCESS) { @@ -1421,7 +1445,7 @@ if (Z_TYPE(retval) == IS_OBJECT && Z_OBJCE(retval) == soap_fault_class_entry) { - soap_server_fault_ex(function, &retval TSRMLS_CC); + soap_server_fault_ex(function, &retval, NULL TSRMLS_CC); } if (function && function->responseName) { @@ -1513,7 +1537,7 @@ SOAP_SERVER_END_CODE(); } -static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault TSRMLS_DC) +static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeader *hdr TSRMLS_DC) { int soap_version; xmlChar *buf, cont_len[30]; @@ -1522,7 +1546,7 @@ soap_version = SOAP_GLOBAL(soap_version); - doc_return = serialize_response_call(function, NULL, NULL, fault, NULL, soap_version TSRMLS_CC); + doc_return = serialize_response_call(function, NULL, NULL, fault, hdr, soap_version TSRMLS_CC); xmlDocDumpMemory(doc_return, &buf, &size); @@ -1553,7 +1577,7 @@ set_soap_fault(&ret, code, string, actor, details, name TSRMLS_CC); /* TODO: Which function */ - soap_server_fault_ex(NULL, &ret TSRMLS_CC); + soap_server_fault_ex(NULL, &ret, NULL TSRMLS_CC); } static void soap_error_handler(int error_num, const char *error_filename, const uint error_lineno, const char *format, va_list args) @@ -2678,6 +2702,65 @@ sdlFaultPtr fault = NULL; prop = Z_OBJPROP_P(ret); + + if (headers && + zend_hash_find(prop, "headerfault", sizeof("headerfault"), (void**)&tmp) == SUCCESS) { + xmlNodePtr head; + encodePtr hdr_enc = NULL; + int hdr_use = SOAP_LITERAL; + zval *hdr_ret = *tmp; + char *hdr_ns = headers->hdr?headers->hdr->ns:NULL; + char *hdr_name = Z_STRVAL(headers->function_name); + + head = xmlNewChild(envelope, ns, "Header", NULL); + if (Z_TYPE_P(hdr_ret) == IS_OBJECT && + Z_OBJCE_P(hdr_ret) == soap_header_class_entry) { + HashTable* ht = Z_OBJPROP_P(hdr_ret); + zval **tmp; + sdlSoapBindingFunctionHeaderPtr *hdr; + smart_str key = {0}; + + if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + smart_str_appendc(&key, ':'); + hdr_ns = Z_STRVAL_PP(tmp); + } + if (zend_hash_find(ht, "name", sizeof("name"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + hdr_name = Z_STRVAL_PP(tmp); + } + smart_str_0(&key); + if (headers->hdr && headers->hdr->headerfaults && + zend_hash_find(headers->hdr->headerfaults, key.c, key.len+1, (void**)&hdr) == SUCCESS) { + hdr_enc = (*hdr)->encode; + hdr_use = (*hdr)->use; + } + smart_str_free(&key); + if (zend_hash_find(ht, "data", sizeof("data"), (void**)&tmp) == SUCCESS) { + hdr_ret = *tmp; + } else { + hdr_ret = NULL; + } + } + + if (headers->function) { + if (serialize_response_call2(head, headers->function, Z_STRVAL(headers->function_name), uri, hdr_ret, version, 0 TSRMLS_CC) == SOAP_ENCODED) { + use = SOAP_ENCODED; + } + } else { + xmlNodePtr xmlHdr = master_to_xml(hdr_enc, hdr_ret, hdr_use, head); + if (hdr_name) { + xmlNodeSetName(xmlHdr,hdr_name); + } + if (hdr_ns) { + xmlNsPtr nsptr = encode_add_ns(xmlHdr,hdr_ns); + xmlSetNs(xmlHdr, nsptr); + } + } + } + body = xmlNewChild(envelope, ns, "Body", NULL); param = xmlNewChild(body, ns, "Fault", NULL); @@ -2816,33 +2899,31 @@ Z_OBJCE(h->retval) == soap_header_class_entry) { HashTable* ht = Z_OBJPROP(h->retval); zval **tmp; + sdlSoapBindingFunctionHeaderPtr *hdr; + smart_str key = {0}; + if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + smart_str_appendc(&key, ':'); + hdr_ns = Z_STRVAL_PP(tmp); + } + if (zend_hash_find(ht, "name", sizeof("name"), (void**)&tmp) == SUCCESS && + Z_TYPE_PP(tmp) == IS_STRING) { + smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); + hdr_name = Z_STRVAL_PP(tmp); + } + smart_str_0(&key); if (function && function->binding && function->binding->bindingType == BINDING_SOAP) { sdlSoapBindingFunctionPtr fnb = (sdlSoapBindingFunctionPtr)function->bindingAttributes; - if (fnb->output.headers) { - sdlSoapBindingFunctionHeaderPtr *hdr; - smart_str key = {0}; - - if (zend_hash_find(ht, "namespace", sizeof("namespace"), (void**)&tmp) == SUCCESS && - Z_TYPE_PP(tmp) == IS_STRING) { - smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); - smart_str_appendc(&key, ':'); - hdr_ns = Z_STRVAL_PP(tmp); - } - if (zend_hash_find(ht, "name", sizeof("name"), (void**)&tmp) == SUCCESS && - Z_TYPE_PP(tmp) == IS_STRING) { - smart_str_appendl(&key, Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); - hdr_name = Z_STRVAL_PP(tmp); - } - smart_str_0(&key); - if (zend_hash_find(fnb->output.headers, key.c, key.len+1, (void**)&hdr) == SUCCESS) { - hdr_enc = (*hdr)->encode; - hdr_use = (*hdr)->use; - } - smart_str_free(&key); + if (fnb->output.headers && + zend_hash_find(fnb->output.headers, key.c, key.len+1, (void**)&hdr) == SUCCESS) { + hdr_enc = (*hdr)->encode; + hdr_use = (*hdr)->use; } } + smart_str_free(&key); if (zend_hash_find(ht, "data", sizeof("data"), (void**)&tmp) == SUCCESS) { hdr_ret = *tmp; } else { @@ -3172,7 +3253,7 @@ } else { ht = function->responseParameters; } - + if (ht == NULL) { return NULL; } http://cvs.php.net/diff.php/php-src/ext/soap/tests/soap12/soap12-test.inc?r1=1.7&r2=1.8&ty=u Index: php-src/ext/soap/tests/soap12/soap12-test.inc diff -u php-src/ext/soap/tests/soap12/soap12-test.inc:1.7 php-src/ext/soap/tests/soap12/soap12-test.inc:1.8 --- php-src/ext/soap/tests/soap12/soap12-test.inc:1.7 Thu Feb 5 15:26:05 2004 +++ php-src/ext/soap/tests/soap12/soap12-test.inc Tue Feb 24 10:06:42 2004 @@ -111,6 +111,15 @@ function echoResolvedRef($ref) { return $ref->RelativeReference->base.$ref->RelativeReference->href; } + + function validateCountryCode($code) { + if (strlen($code) != 2) { + return new SoapFault("Client", "Not a valid country code", NULL, NULL, NULL, new SoapHeader("http://example.org/ts-tests", "validateCountryCodeFault", "Country code must be 2 letters.")); + } else { + return "OK"; + } + } + } $server = new soapserver(dirname(__FILE__)."/soap12-test.wsdl", array('soap_version'=>SOAP_1_2,'actor'=>"http://example.org/ts-tests/C")); http://cvs.php.net/diff.php/php-src/ext/soap/tests/soap12/soap12-test.wsdl?r1=1.3&r2=1.4&ty=u Index: php-src/ext/soap/tests/soap12/soap12-test.wsdl diff -u php-src/ext/soap/tests/soap12/soap12-test.wsdl:1.3 php-src/ext/soap/tests/soap12/soap12-test.wsdl:1.4 --- php-src/ext/soap/tests/soap12/soap12-test.wsdl:1.3 Mon Feb 2 12:39:10 2004 +++ php-src/ext/soap/tests/soap12/soap12-test.wsdl Tue Feb 24 10:06:42 2004 @@ -125,6 +125,8 @@ <!-- 3.2.9 validateCountryCode --> <element name="validateCountryCode" type="xsd:string"/> + <element name="validateCountryCodeResponse" type="xsd:string"/> + <!-- 3.2.10 validateCountryCodeFault --> <element name="validateCountryCodeFault" type="xsd:string"/> @@ -346,6 +348,17 @@ <part name="Unknown" type="types:UnknownType" /> </message> + <message name="validateCountryCodeRequest"> + <part name="validateCountryCode" element="test:validateCountryCode" /> + </message> + <message name="validateCountryCodeFault"> + <part name="validateCountryCodeFault" element="test:validateCountryCodeFault" /> + </message> + <message name="validateCountryCodeResponse"> + <part name="validateCountryCodeResponse" element="test:validateCountryCodeResponse" /> + </message> + + <portType name="Soap12TestPortTypeDoc"> <operation name="emptyBody"> <input message="tns:emptyBodyRequest" /> @@ -487,13 +500,15 @@ <input> <soap12:body use="literal" /> <soap12:header message="tns:echoOkRequest" part="echoOk" use="literal" /> - <soap12:header message="tns:UnknownHdrBlockLit" part="Unknown" use="literal" /> - + <soap12:header message="tns:UnknownHdrBlockLit" part="Unknown" use="literal" /> + <soap12:header message="tns:validateCountryCodeRequest" part="validateCountryCode" use="literal"> + <soap12:headerfault message="tns:validateCountryCodeFault" part="validateCountryCodeFault" use="literal"/> + </soap12:header> </input> <output> <soap12:body use="literal" /> <soap12:header message="tns:echoOkResponse" part="responseOk" use="literal" /> - + <soap12:header message="tns:validateCountryCodeResponse" part="validateCountryCodeResponse" use="literal"/> </output> </operation> <operation name="echoOk"> http://cvs.php.net/co.php/php-src/ext/soap/tests/soap12/T63.phpt?r=1.1&p=1 Index: php-src/ext/soap/tests/soap12/T63.phpt +++ php-src/ext/soap/tests/soap12/T63.phpt --TEST-- SOAP 1.2: T63 validateCountryCode --SKIPIF-- <?php require_once('skipif.inc'); ?> --FILE-- <?php $HTTP_RAW_POST_DATA = <<<EOF <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <test:validateCountryCode xmlns:test="http://example.org/ts-tests" env:role="http://example.org/ts-tests/C" env:mustUnderstand="1">ABCD</test:validateCountryCode> </env:Header> <env:Body> </env:Body> </env:Envelope> EOF; include "soap12-test.inc"; ?> --EXPECT-- <?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://example.org/ts-tests"><env:Header><ns1:validateCountryCodeFault>Country code must be 2 letters.</ns1:validateCountryCodeFault></env:Header><env:Body><env:Fault><env:Code><env:Value>env:Sender</env:Value></env:Code><env:Reason><env:Text>Not a valid country code</env:Text></env:Reason></env:Fault></env:Body></env:Envelope>
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php