dmitry Mon Nov 6 16:36:54 2006 UTC Modified files: /php-src/ext/soap php_packet_soap.c /php-src/ext/soap/tests/bugs bug39121.phpt Log: Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client) http://cvs.php.net/viewvc.cgi/php-src/ext/soap/php_packet_soap.c?r1=1.49&r2=1.50&diff_format=u Index: php-src/ext/soap/php_packet_soap.c diff -u php-src/ext/soap/php_packet_soap.c:1.49 php-src/ext/soap/php_packet_soap.c:1.50 --- php-src/ext/soap/php_packet_soap.c:1.49 Tue Sep 19 10:38:30 2006 +++ php-src/ext/soap/php_packet_soap.c Mon Nov 6 16:36:54 2006 @@ -17,7 +17,7 @@ | Dmitry Stogov <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ -/* $Id: php_packet_soap.c,v 1.49 2006/09/19 10:38:30 dmitry Exp $ */ +/* $Id: php_packet_soap.c,v 1.50 2006/11/06 16:36:54 dmitry Exp $ */ #include "php_soap.h" @@ -345,6 +345,7 @@ if (val != NULL) { if (!node_is_equal_ex(val,"result",RPC_SOAP12_NAMESPACE)) { zval *tmp; + zval **arr; tmp = master_to_zval(NULL, val); if (val->name) { @@ -353,10 +354,32 @@ zstr u_name; int u_name_len; zend_string_to_unicode_ex(UG(utf8_conv), &u_name.u, &u_name_len, (char*)val->name, strlen((char*)val->name), &status); - add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, tmp); + if (zend_u_hash_find(Z_ARRVAL_P(return_value), IS_UNICODE, u_name, u_name_len+1, (void**)&arr) == SUCCESS) { + add_next_index_zval(*arr, tmp); + } else if (val->next && get_node(val->next, (char*)val->name)) { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmp); + add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, arr); + } else { + add_u_assoc_zval_ex(return_value, IS_UNICODE, u_name, u_name_len+1, tmp); + } efree(u_name.u); } else { - add_assoc_zval(return_value, (char*)val->name, tmp); + if (zend_hash_find(Z_ARRVAL_P(return_value), (char*)val->name, strlen((char*)val->name)+1, (void**)&arr) == SUCCESS) { + add_next_index_zval(*arr, tmp); + } else if (val->next && get_node(val->next, (char*)val->name)) { + zval *arr; + + MAKE_STD_ZVAL(arr); + array_init(arr); + add_next_index_zval(arr, tmp); + add_assoc_zval(return_value, (char*)val->name, arr); + } else { + add_assoc_zval(return_value, (char*)val->name, tmp); + } } } else { add_next_index_zval(return_value, tmp); http://cvs.php.net/viewvc.cgi/php-src/ext/soap/tests/bugs/bug39121.phpt?r1=1.1&r2=1.2&diff_format=u Index: php-src/ext/soap/tests/bugs/bug39121.phpt diff -u /dev/null php-src/ext/soap/tests/bugs/bug39121.phpt:1.2 --- /dev/null Mon Nov 6 16:36:54 2006 +++ php-src/ext/soap/tests/bugs/bug39121.phpt Mon Nov 6 16:36:54 2006 @@ -0,0 +1,73 @@ +--TEST-- +Bug #39121 (Incorrect return array handling in non-wsdl soap client) +--SKIPIF-- +<?php require_once('skipif.inc'); ?> +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- +<?php +class LocalSoapClient extends SoapClient { + function __doRequest($request, $location, $action, $version) { + return <<<EOF +<?xml version="1.0" encoding="UTF-8"?> +<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> + <soap:Body> + <getDIDAreaResponse xmlns="http://didx.org/GetList"> + <soapenc:Array soapenc:arrayType="xsd:string[2]" xsi:type="soapenc:Array"> + <item xsi:type="xsd:string">StateCode</item> + <item xsi:type="xsd:string">description</item> + </soapenc:Array> + <soapenc:Array soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> + <item xsi:type="xsd:int">241</item> + <item xsi:type="xsd:string">Carabobo</item> + </soapenc:Array> + <soapenc:Array soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> + <item xsi:type="xsd:int">243</item> + <item xsi:type="xsd:string">Aragua and Carabobo</item> + </soapenc:Array> + <soapenc:Array soapenc:arrayType="xsd:anyType[2]" xsi:type="soapenc:Array"> + <item xsi:type="xsd:int">261</item> + <item xsi:type="xsd:string">Zulia</item> + </soapenc:Array> + </getDIDAreaResponse> + </soap:Body> +</soap:Envelope> +EOF; + } +} + +$client = new LocalSoapClient(NULL, array('location'=>'test://','uri'=>'test://')); +print_r($client->getDIDAreaResponse()); +?> +--EXPECT-- +Array +( + [Array] => Array + ( + [0] => Array + ( + [0] => StateCode + [1] => description + ) + + [1] => Array + ( + [0] => 241 + [1] => Carabobo + ) + + [2] => Array + ( + [0] => 243 + [1] => Aragua and Carabobo + ) + + [3] => Array + ( + [0] => 261 + [1] => Zulia + ) + + ) + +)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php