dmitry Tue Mar 21 12:04:55 2006 UTC Added files: (Branch: PHP_5_1) /php-src/ext/soap/tests server023.phpt server024.phpt server025.phpt server025.wsdl
Modified files: /php-src NEWS /php-src/ext/soap php_soap.h soap.c Log: Fixed bug #36721 (The SoapServer is not able to send a header that it didn't receive) http://cvs.php.net/viewcvs.cgi/php-src/NEWS?r1=1.2027.2.474&r2=1.2027.2.475&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.474 php-src/NEWS:1.2027.2.475 --- php-src/NEWS:1.2027.2.474 Tue Mar 21 08:49:42 2006 +++ php-src/NEWS Tue Mar 21 12:04:55 2006 @@ -11,7 +11,9 @@ - Removed the E_STRICT deprecation notice from "var". (Ilia) - Fixed debug_zval_dump() to support private and protected members. (Dmitry) - Fixed bug #36809 (__FILE__ behavior changed). (Dmitry) -- FIxed bug #36808 (syslog ident becomes garbage between requests). (Tony) +- Fixed bug #36808 (syslog ident becomes garbage between requests). (Tony) +- Fixed bug #36721 (The SoapServer is not able to send a header that it didn't + receive). (Dmitry) - Fixed bug #36756 (DOMDocument::removeChild corrupts node). (Rob) - Fixed bug #36749 (SOAP: 'Error Fetching http body' when using HTTP Proxy). (Dmitry) http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/php_soap.h?r1=1.38.2.3&r2=1.38.2.4&diff_format=u Index: php-src/ext/soap/php_soap.h diff -u php-src/ext/soap/php_soap.h:1.38.2.3 php-src/ext/soap/php_soap.h:1.38.2.4 --- php-src/ext/soap/php_soap.h:1.38.2.3 Tue Feb 7 12:49:09 2006 +++ php-src/ext/soap/php_soap.h Tue Mar 21 12:04:55 2006 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_soap.h,v 1.38.2.3 2006/02/07 12:49:09 dmitry Exp $ */ +/* $Id: php_soap.h,v 1.38.2.4 2006/03/21 12:04:55 dmitry Exp $ */ #ifndef PHP_SOAP_H #define PHP_SOAP_H @@ -97,6 +97,8 @@ } map_class; }; +struct _soapHeader; + struct _soapService { sdlPtr sdl; @@ -120,6 +122,7 @@ xmlCharEncodingHandlerPtr encoding; HashTable *class_map; int features; + struct _soapHeader **soap_headers_ptr; }; #define SOAP_CLASS 1 http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/soap.c?r1=1.156.2.19&r2=1.156.2.20&diff_format=u Index: php-src/ext/soap/soap.c diff -u php-src/ext/soap/soap.c:1.156.2.19 php-src/ext/soap/soap.c:1.156.2.20 --- php-src/ext/soap/soap.c:1.156.2.19 Fri Mar 10 11:46:51 2006 +++ php-src/ext/soap/soap.c Tue Mar 21 12:04:55 2006 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: soap.c,v 1.156.2.19 2006/03/10 11:46:51 dmitry Exp $ */ +/* $Id: soap.c,v 1.156.2.20 2006/03/21 12:04:55 dmitry Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -244,6 +244,7 @@ PHP_METHOD(SoapServer, handle); PHP_METHOD(SoapServer, setPersistence); PHP_METHOD(SoapServer, fault); +PHP_METHOD(SoapServer, addSoapHeader); #ifdef HAVE_PHP_DOMXML PHP_METHOD(PHP_SOAP_SERVER_CLASS, map); #endif @@ -309,6 +310,7 @@ PHP_ME(SoapServer, getFunctions, NULL, 0) PHP_ME(SoapServer, handle, NULL, 0) PHP_ME(SoapServer, fault, NULL, 0) + PHP_ME(SoapServer, addSoapHeader, NULL, 0) #ifdef HAVE_PHP_DOMXML PHP_ME(SoapServer, map, NULL, 0) #endif @@ -1518,6 +1520,8 @@ old_soap_version = SOAP_GLOBAL(soap_version); function = deserialize_function_call(service->sdl, doc_request, service->actor, &function_name, &num_params, ¶ms, &soap_version, &soap_headers TSRMLS_CC); xmlFreeDoc(doc_request); + + service->soap_headers_ptr = &soap_headers; soap_obj = NULL; if (service->type == SOAP_CLASS) { @@ -1802,15 +1806,18 @@ int i; soap_headers = soap_headers->next; - i = h->num_params; - while (i > 0) { - zval_ptr_dtor(&h->parameters[--i]); + if (h->parameters) { + i = h->num_params; + while (i > 0) { + zval_ptr_dtor(&h->parameters[--i]); + } + efree(h->parameters); } - efree(h->parameters); zval_dtor(&h->function_name); zval_dtor(&h->retval); efree(h); } + service->soap_headers_ptr = NULL; /* Free Memory */ if (num_params > 0) { @@ -1847,6 +1854,37 @@ } /* }}} */ +PHP_METHOD(SoapServer, addSoapHeader) +{ + soapServicePtr service; + zval *fault; + soapHeader **p; + + SOAP_SERVER_BEGIN_CODE(); + + FETCH_THIS_SERVICE(service); + + if (!service || !service->soap_headers_ptr) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "The SoapServer::addSoapHeader function may be called only during SOAP request processing"); + } + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &fault, soap_header_class_entry) == FAILURE) { + php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid parameters"); + } + + p = service->soap_headers_ptr; + while (*p != NULL) { + p = &(*p)->next; + } + *p = emalloc(sizeof(soapHeader)); + memset(*p, 0, sizeof(soapHeader)); + ZVAL_NULL(&(*p)->function_name); + (*p)->retval = *fault; + zval_copy_ctor(&(*p)->retval); + + SOAP_SERVER_END_CODE(); +} + static void soap_server_fault_ex(sdlFunctionPtr function, zval* fault, soapHeader *hdr TSRMLS_DC) { int soap_version; @@ -2523,7 +2561,7 @@ zend_hash_internal_pointer_reset(ht); while (zend_hash_get_current_data(ht, (void**)&tmp) == SUCCESS) { if (Z_TYPE_PP(tmp) != IS_OBJECT || - Z_OBJCE_PP(tmp) != soap_header_class_entry) { + !instanceof_function(Z_OBJCE_PP(tmp), soap_header_class_entry TSRMLS_CC)) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid SOAP header"); } zend_hash_move_forward(ht); @@ -2583,7 +2621,7 @@ verify_soap_headers_array(soap_headers TSRMLS_CC); free_soap_headers = 0; } else if (Z_TYPE_P(headers) == IS_OBJECT && - Z_OBJCE_P(headers) == soap_header_class_entry) { + instanceof_function(Z_OBJCE_P(headers), soap_header_class_entry TSRMLS_CC)) { soap_headers = emalloc(sizeof(HashTable)); zend_hash_init(soap_headers, 0, NULL, ZVAL_PTR_DTOR, 0); zend_hash_next_index_insert(soap_headers, &headers, sizeof(zval*), NULL); @@ -2846,7 +2884,7 @@ add_property_zval(this_ptr, "__default_headers", headers); } } else if (Z_TYPE_P(headers) == IS_OBJECT && - Z_OBJCE_P(headers) == soap_header_class_entry) { + instanceof_function(Z_OBJCE_P(headers), soap_header_class_entry TSRMLS_CC)) { zval *default_headers; ALLOC_INIT_ZVAL(default_headers); array_init(default_headers); @@ -3518,7 +3556,7 @@ head = xmlNewChild(envelope, ns, "Header", NULL); if (Z_TYPE_P(hdr_ret) == IS_OBJECT && - Z_OBJCE_P(hdr_ret) == soap_header_class_entry) { + instanceof_function(Z_OBJCE_P(hdr_ret), soap_header_class_entry)) { HashTable* ht = Z_OBJPROP_P(hdr_ret); zval **tmp; sdlSoapBindingFunctionHeaderPtr *hdr; @@ -3745,7 +3783,7 @@ if (Z_TYPE(h->retval) == IS_OBJECT && - Z_OBJCE(h->retval) == soap_header_class_entry) { + instanceof_function(Z_OBJCE(h->retval), soap_header_class_entry TSRMLS_CC)) { HashTable* ht = Z_OBJPROP(h->retval); zval **tmp; sdlSoapBindingFunctionHeaderPtr *hdr; http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/server023.phpt?view=markup&rev=1.1 Index: php-src/ext/soap/tests/server023.phpt +++ php-src/ext/soap/tests/server023.phpt http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/server024.phpt?view=markup&rev=1.1 Index: php-src/ext/soap/tests/server024.phpt +++ php-src/ext/soap/tests/server024.phpt http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/server025.phpt?view=markup&rev=1.1 Index: php-src/ext/soap/tests/server025.phpt +++ php-src/ext/soap/tests/server025.phpt http://cvs.php.net/viewcvs.cgi/php-src/ext/soap/tests/server025.wsdl?view=markup&rev=1.1 Index: php-src/ext/soap/tests/server025.wsdl +++ php-src/ext/soap/tests/server025.wsdl -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php