From 6cb3fad99ba70b12852fd58916b8e6acd1b14be9 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 8 Nov 2006 10:05:33 +0000 Subject: [PATCH] Fixed bug #38536 (SOAP returns an array of values instead of an object) --- ext/soap/php_encoding.c | 13 +++---- ext/soap/tests/bugs/bug38536.phpt | 52 ++++++++++++++++++++++++++++ ext/soap/tests/bugs/bug38536.wsdl | 57 +++++++++++++++++++++++++++++++ 3 files changed, 116 insertions(+), 6 deletions(-) create mode 100755 ext/soap/tests/bugs/bug38536.phpt create mode 100755 ext/soap/tests/bugs/bug38536.wsdl diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 84c4aabd39..712d8bb1ea 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -1103,13 +1103,14 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr if (node) { zval *val; + xmlNodePtr r_node; - node = check_and_resolve_href(node); - if (node && node->children && node->children->content) { - if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)node->children->content) != 0) { - soap_error3(E_ERROR, "Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)", model->u.element->name, model->u.element->fixed, node->children->content); + r_node = check_and_resolve_href(node); + if (r_node && r_node->children && r_node->children->content) { + if (model->u.element->fixed && strcmp(model->u.element->fixed, (char*)r_node->children->content) != 0) { + soap_error3(E_ERROR, "Encoding: Element '%s' has fixed value '%s' (value '%s' is not allowed)", model->u.element->name, model->u.element->fixed, r_node->children->content); } - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } else if (model->u.element->fixed) { xmlNodePtr dummy = xmlNewNode(NULL, BAD_CAST("BOGUS")); xmlNodeSetContent(dummy, BAD_CAST(model->u.element->fixed)); @@ -1121,7 +1122,7 @@ static void model_to_zval_object(zval *ret, sdlContentModelPtr model, xmlNodePtr val = master_to_zval(model->u.element->encode, dummy); xmlFreeNode(dummy); } else { - val = master_to_zval(model->u.element->encode, node); + val = master_to_zval(model->u.element->encode, r_node); } if ((node = get_node(node->next, model->u.element->name)) != NULL) { zval *array; diff --git a/ext/soap/tests/bugs/bug38536.phpt b/ext/soap/tests/bugs/bug38536.phpt new file mode 100755 index 0000000000..1dd84d601e --- /dev/null +++ b/ext/soap/tests/bugs/bug38536.phpt @@ -0,0 +1,52 @@ +--TEST-- +Bug #38536 (SOAP returns an array of values instead of an object) +--SKIPIF-- + +--INI-- +soap.wsdl_cache_enabled=0 +--FILE-- + + + + + + 2 +
+ + + + 2 +
+ +
Test
+ + +EOF; + } +} + +ini_set("soap.wsdl_cache_enabled", 0); +$SOAPObject = new LocalSoapClient(dirname(__FILE__).'/bug38536.wsdl'); +print_r($SOAPObject->test()); +?> +--EXPECT-- +stdClass Object +( + [id] => 2 + [address] => stdClass Object + ( + [idClient] => 2 + [address] => Test + ) + +) diff --git a/ext/soap/tests/bugs/bug38536.wsdl b/ext/soap/tests/bugs/bug38536.wsdl new file mode 100755 index 0000000000..0ef3fd43cd --- /dev/null +++ b/ext/soap/tests/bugs/bug38536.wsdl @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- 2.50.1