summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/soap/php_encoding.c5
-rwxr-xr-xext/soap/tests/any.phpt83
2 files changed, 86 insertions, 2 deletions
diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c
index c0494b8f98..bca17d4a59 100644
--- a/ext/soap/php_encoding.c
+++ b/ext/soap/php_encoding.c
@@ -2760,15 +2760,16 @@ static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style, xmlNodeP
if (Z_TYPE_P(data) == IS_STRING) {
ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data));
+ ret->name = xmlStringTextNoenc;
} else {
zval tmp = *data;
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
- ret = xmlNewTextLen(Z_STRVAL_P(data), Z_STRLEN_P(data));
+ ret = xmlNewTextLen(Z_STRVAL(tmp), Z_STRLEN(tmp));
zval_dtor(&tmp);
+ ret->name = xmlStringTextNoenc;
}
- ret->name = xmlStringTextNoenc;
xmlAddChild(parent, ret);
return ret;
diff --git a/ext/soap/tests/any.phpt b/ext/soap/tests/any.phpt
new file mode 100755
index 0000000000..306557b302
--- /dev/null
+++ b/ext/soap/tests/any.phpt
@@ -0,0 +1,83 @@
+--TEST--
+SOAP handling of <any>
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+class SOAPComplexType {
+ function SOAPComplexType($s, $i, $f) {
+ $this->varString = $s;
+ $this->varInt = $i;
+ $this->varFloat = $f;
+ }
+}
+$struct = new SOAPComplexType('arg',34,325.325);
+
+function echoAnyElement($x) {
+ global $g;
+
+ $g = $x;
+ $struct = $x->inputAny->any;
+ if ($struct instanceof SOAPComplexType) {
+ return array("return" => array("any" => new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPComplexType", "http://soapinterop.org/xsd", "SOAPComplexType", "http://soapinterop.org/")));
+ } else {
+ return "?";
+ }
+}
+
+class TestSoapClient extends SoapClient {
+ function __construct($wsdl, $options) {
+ parent::__construct($wsdl, $options);
+ $this->server = new SoapServer($wsdl, $options);
+ $this->server->addFunction('echoAnyElement');
+ }
+
+ function __doRequest($request, $location, $action, $version) {
+ ob_start();
+ $this->server->handle($request);
+ $response = ob_get_contents();
+ ob_end_clean();
+ return $response;
+ }
+}
+
+$client = new TestSoapClient(dirname(__FILE__)."/interop/Round4/GroupI/round4_groupI_xsd.wsdl",
+ array("trace"=>1,"exceptions"=>0,
+ 'classmap' => array('SOAPComplexType'=>'SOAPComplexType')));
+$ret = $client->echoAnyElement(
+ array(
+ "inputAny"=>array(
+ "any"=>new SoapVar($struct, SOAP_ENC_OBJECT, "SOAPComplexType", "http://soapinterop.org/xsd", "SOAPComplexType", "http://soapinterop.org/")
+ )));
+var_dump($g);
+var_dump($ret);
+?>
+--EXPECT--
+object(stdClass)#5 (1) {
+ ["inputAny"]=>
+ object(stdClass)#6 (1) {
+ ["any"]=>
+ object(SOAPComplexType)#7 (3) {
+ ["varInt"]=>
+ int(34)
+ ["varString"]=>
+ string(3) "arg"
+ ["varFloat"]=>
+ float(325.325)
+ }
+ }
+}
+object(stdClass)#8 (1) {
+ ["return"]=>
+ object(stdClass)#9 (1) {
+ ["any"]=>
+ object(SOAPComplexType)#10 (3) {
+ ["varInt"]=>
+ int(34)
+ ["varString"]=>
+ string(3) "arg"
+ ["varFloat"]=>
+ float(325.325)
+ }
+ }
+}