Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client)

This commit is contained in:
Dmitry Stogov 2006-11-06 16:36:43 +00:00
parent c263929002
commit 7b8f30adcb
3 changed files with 88 additions and 1 deletions

2
NEWS
View File

@ -27,6 +27,8 @@ PHP NEWS
(michal dot taborsky at gmail dot com, Ilia)
- Fixed bug #39215 (Inappropriate close of stdin/stdout/stderr). (Wez,Ilia)
- Fixed bug #39151 (Parse error in recursiveiteratoriterator.php). (Marcus)
- Fixed bug #39121 (Incorrect return array handling in non-wsdl soap client).
(Dmitry)
- Fixed bug #39090 (DirectoryFilterDots doxygen docs and example is wrong).
(Marcus)
- Fixed bug #38698 (for some keys cdbmake creates corrupted db and cdb can't

View File

@ -350,10 +350,22 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
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) {
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);
}

View File

@ -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
)
)
)