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

Reply via email to