]> granicus.if.org Git - php/commitdiff
Fixed bug #34643 (wsdl default value has no effect)
authorDmitry Stogov <dmitry@php.net>
Tue, 27 Sep 2005 15:24:47 +0000 (15:24 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 27 Sep 2005 15:24:47 +0000 (15:24 +0000)
ext/soap/soap.c
ext/soap/tests/bugs/bug34643.phpt [new file with mode: 0755]
ext/soap/tests/bugs/bug34643.wsdl [new file with mode: 0755]

index bb50bfd54a3f4deff90768ffdbf79ab52e1ac5d2..cc20eff4c7cc121675bac5aa85ffcd9f89870c01 100644 (file)
@@ -4018,9 +4018,21 @@ static xmlNodePtr serialize_zval(zval *val, sdlParamPtr param, char *paramName,
 {
        xmlNodePtr xmlParam;
        encodePtr enc;
+       zval defval;
 
        if (param != NULL) {
                enc = param->encode;
+               if (val == NULL || Z_TYPE_P(val) == IS_NULL) {
+                       if (param->element) {
+                               if (param->element->fixed) {
+                                       ZVAL_STRING(&defval, param->element->fixed, 0);
+                                       val = &defval;
+                               } else if (param->element->def && !param->element->nillable) {
+                                       ZVAL_STRING(&defval, param->element->def, 0);
+                                       val = &defval;
+                               }
+                       }
+               }
        } else {
                enc = NULL;
        }
diff --git a/ext/soap/tests/bugs/bug34643.phpt b/ext/soap/tests/bugs/bug34643.phpt
new file mode 100755 (executable)
index 0000000..b8c92e2
--- /dev/null
@@ -0,0 +1,46 @@
+--TEST--
+Bug #34643 (wsdl default value)
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--INI--
+soap.wsdl_cache_enabled=0
+--FILE--
+<?php
+ini_set("soap.wsdl_cache_enabled", 0);
+
+class fp {
+       public function get_it($opt="zzz") {
+               return $opt;
+       }
+}
+
+class LocalSoapClient extends SoapClient {
+
+  function __construct($wsdl, $options) {
+    parent::__construct($wsdl, $options);
+    $this->server = new SoapServer($wsdl, $options);
+    $this->server->setClass('fp');
+  }
+
+  function __doRequest($request, $location, $action, $version) {
+    ob_start();
+    $this->server->handle($request);
+    $response = ob_get_contents();
+    ob_end_clean();
+    return $response;
+  }
+
+}
+
+$cl = new LocalSoapClient(dirname(__FILE__).'/bug34643.wsdl', array("trace"=>1));
+print_r($cl->__getFunctions());
+echo $cl->get_it("aaa")."\n";
+echo $cl->get_it()."\n";
+?>
+--EXPECT--
+Array
+(
+    [0] => string get_it(string $opt)
+)
+aaa
+zzz
diff --git a/ext/soap/tests/bugs/bug34643.wsdl b/ext/soap/tests/bugs/bug34643.wsdl
new file mode 100755 (executable)
index 0000000..24c3a50
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version='1.0' encoding='UTF-8'?>\r
+<definitions name="wsdl" targetNamespace="urn:wsdl"\r
+xmlns:typens="urn:wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema"\r
+xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"\r
+xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"\r
+xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"\r
+xmlns="http://schemas.xmlsoap.org/wsdl/">\r
+       <types>\r
+               <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:wsdl">\r
+                       <xsd:element name="opt" type="xsd:string" default="zzz" />\r
+               </xsd:schema>\r
+       </types>\r
+       <message name="get_it">\r
+               <part name="opt" element="typens:opt"/>\r
+       </message>\r
+       <message name="get_itResponse">\r
+               <part name="return" type="xsd:string"/>\r
+       </message>\r
+       <portType name="fpPortType">\r
+               <operation name="get_it">\r
+                       <input message="typens:get_it"/>\r
+                       <output message="typens:get_itResponse"/>\r
+               </operation>\r
+       </portType>\r
+       <binding name="fpBinding" type="typens:fpPortType">\r
+               <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>\r
+               <operation name="get_it">\r
+                       <soap:operation soapAction="urn:fpAction"/>\r
+                       <input>\r
+                               <soap:body namespace="urn:wsdl" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
+                       </input>\r
+                       <output>\r
+                               <soap:body namespace="urn:wsdl" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>\r
+                       </output>\r
+               </operation>\r
+       </binding>\r
+       <service name="wsdlService">\r
+               <port name="fpPort" binding="typens:fpBinding">\r
+                       <soap:address location="**********"/>\r
+               </port>\r
+       </service>\r
+</definitions>\r