]> granicus.if.org Git - php/commitdiff
Fixed bug #32776 (SOAP doesn't support one-way operations)
authorDmitry Stogov <dmitry@php.net>
Wed, 20 Apr 2005 10:58:38 +0000 (10:58 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 20 Apr 2005 10:58:38 +0000 (10:58 +0000)
NEWS
ext/soap/php_packet_soap.c
ext/soap/soap.c
ext/soap/tests/bugs/bug32776.phpt [new file with mode: 0644]
ext/soap/tests/bugs/bug32776.wsdl [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 27e769cff75f2de262b9313d8a0f26b7e70db427..e6375d2e3faebd16b65919a478b3d0a6be0d2ed8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -6,6 +6,7 @@ PHP                                                                        NEWS
 - Changed sha1_file() and md5_file() functions to use streams instead of
   low level IO. (Uwe)
 - Fixed memory corruption in ImageTTFText() with 64bit systems. (Andrey)
+- Fixed bug #32776 (SOAP doesn't support one-way operations). (Dmitry)
 - Fixed bug #32759 (incorrect determination of default value (COM)). (Wez)
 - Fixed bug #32758 (Cannot access safearray properties in VB6 objects). (Wez)
 - Fixed bug #32755 (Segfault in replaceChild() when DocumentFragment has
index 81805b4b428269b8a1e6eb0914c9ad45c2b4865c..fbf476611b225e901c9c085ed1bc78d63bce941f 100644 (file)
@@ -34,6 +34,11 @@ int parse_packet_soap(zval *this_ptr, char *buffer, int buffer_size, sdlFunction
 
        ZVAL_NULL(return_value);
 
+       /* Response for one-way opearation */
+       if (buffer_size == 0) {
+               return TRUE;
+       }
+
        /* Parse XML packet */
        response = soap_xmlParseMemory(buffer, buffer_size);
 
index 42fd649716314df594d4a2095c3acdeaff55ff42..41c7d30060e0090f0e6a9525d8818b168d575f2f 100644 (file)
@@ -1689,25 +1689,30 @@ PHP_METHOD(SoapServer, handle)
        /* Flush buffer */
        php_end_ob_buffer(0, 0 TSRMLS_CC);
 
-       /* xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); */
-       xmlDocDumpMemory(doc_return, &buf, &size);
-
-       if (size == 0) {
-               php_error_docref(NULL TSRMLS_CC, E_ERROR, "Dump memory failed");
-       }
+       if (doc_return) {
+               /* xmlDocDumpMemoryEnc(doc_return, &buf, &size, XML_CHAR_ENCODING_UTF8); */
+               xmlDocDumpMemory(doc_return, &buf, &size);
+
+               if (size == 0) {
+                       php_error_docref(NULL TSRMLS_CC, E_ERROR, "Dump memory failed");
+               }       
+
+               sprintf(cont_len, "Content-Length: %d", size);
+               sapi_add_header(cont_len, strlen(cont_len), 1);
+               if (soap_version == SOAP_1_2) {
+                       sapi_add_header("Content-Type: application/soap+xml; charset=utf-8", sizeof("Content-Type: application/soap+xml; charset=utf-8")-1, 1);
+               } else {
+                       sapi_add_header("Content-Type: text/xml; charset=utf-8", sizeof("Content-Type: text/xml; charset=utf-8")-1, 1);
+               }
 
-       sprintf(cont_len, "Content-Length: %d", size);
-       sapi_add_header(cont_len, strlen(cont_len), 1);
-       if (soap_version == SOAP_1_2) {
-               sapi_add_header("Content-Type: application/soap+xml; charset=utf-8", sizeof("Content-Type: application/soap+xml; charset=utf-8")-1, 1);
+               xmlFreeDoc(doc_return);
+               php_write(buf, size TSRMLS_CC);
+               xmlFree(buf);
        } else {
-               sapi_add_header("Content-Type: text/xml; charset=utf-8", sizeof("Content-Type: text/xml; charset=utf-8")-1, 1);
+               sapi_add_header("HTTP/1.1 202 Accepted", sizeof("HTTP/1.1 202 Accepted")-1, 1);
+               sapi_add_header("Content-Length: 0", sizeof("Content-Length: 0")-1, 1);
        }
 
-       xmlFreeDoc(doc_return);
-       php_write(buf, size TSRMLS_CC);
-       xmlFree(buf);
-
 fail:
        SOAP_GLOBAL(soap_version) = old_soap_version;
        SOAP_GLOBAL(encoding) = old_encoding;
@@ -3156,7 +3161,7 @@ static int serialize_response_call2(xmlNodePtr body, sdlFunctionPtr function, ch
                        ns = encode_add_ns(body, fnb->output.ns);
                        if (function->responseName) {
                                method = xmlNewChild(body, ns, function->responseName, NULL);
-                       } else {
+                       } else if (function->responseParameters) {
                                method = xmlNewChild(body, ns, function->functionName, NULL);
                        }
                }
@@ -3248,6 +3253,7 @@ static xmlDocPtr serialize_response_call(sdlFunctionPtr function, char *function
        xmlNodePtr envelope = NULL, body, param;
        xmlNsPtr ns = NULL;
        int use = SOAP_LITERAL;
+       xmlNodePtr head = NULL;
 
        encode_reset_ns();
 
@@ -3459,7 +3465,6 @@ static xmlDocPtr serialize_response_call(sdlFunctionPtr function, char *function
        } else {
 
                if (headers) {
-                       xmlNodePtr head;
                        soapHeader *h;
 
                        head = xmlNewChild(envelope, ns, "Header", NULL);
@@ -3552,6 +3557,11 @@ static xmlDocPtr serialize_response_call(sdlFunctionPtr function, char *function
                }
        }
 
+       if (function && function->responseName == NULL && 
+           body->children == NULL && head == NULL) {
+               xmlFreeDoc(doc);
+               return NULL;
+       }
        return doc;
 }
 
diff --git a/ext/soap/tests/bugs/bug32776.phpt b/ext/soap/tests/bugs/bug32776.phpt
new file mode 100644 (file)
index 0000000..b3c4ff0
--- /dev/null
@@ -0,0 +1,47 @@
+--TEST--
+Bug #32776 SOAP doesn't support one-way operations
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+$d = null;
+
+function test($x) {
+       global $d;
+       $d = $x;
+}
+
+class LocalSoapClient extends SoapClient {
+
+  function __construct($wsdl, $options) {
+    parent::__construct($wsdl, $options);
+    $this->server = new SoapServer($wsdl, $options);
+    $this->server->addFunction('test');
+  }
+
+  function __doRequest($request, $location, $action, $version) {
+    ob_start();
+    $this->server->handle($request);
+    $response = ob_get_contents();
+    ob_end_clean();
+    return $response;
+  }
+
+}
+
+$x = new LocalSoapClient(dirname(__FILE__)."/bug32776.wsdl",array("trace"=>true,"exceptions"=>false)); 
+var_dump($x->test("Hello"));
+var_dump($d);
+var_dump($x->__getLastRequest());
+var_dump($x->__getLastResponse());
+echo "ok\n";
+?>
+--EXPECT--
+NULL
+string(5) "Hello"
+string(459) "<?xml version="1.0" encoding="UTF-8"?>
+<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><SOAP-ENV:test><x xsi:type="xsd:string">Hello</x></SOAP-ENV:test></SOAP-ENV:Body></SOAP-ENV:Envelope>
+"
+string(0) ""
+ok
diff --git a/ext/soap/tests/bugs/bug32776.wsdl b/ext/soap/tests/bugs/bug32776.wsdl
new file mode 100644 (file)
index 0000000..7339018
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" ?>
+<definitions
+    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
+    xmlns:si="http://soapinterop.org/xsd"
+    xmlns:tns="http://linuxsrv.home/~dmitry/soap/test.wsdl"
+    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+    xmlns="http://schemas.xmlsoap.org/wsdl/"
+    targetNamespace="http://linuxsrv.home/~dmitry/soap/test.wsdl">
+
+  <types>
+    <xsd:schema targetNamespace="http://linuxsrv.home/~dmitry/soap/test.wsdl">
+      <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
+      <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
+    </xsd:schema>
+  </types>
+
+  <message name="TestRequest">
+    <part name="x" type="xsd:string" />
+  </message>
+
+  <portType name="TestServicePortType">
+    <operation name="test">
+      <input message="tns:TestRequest" />
+    </operation>
+  </portType>
+
+  <binding name="TestServiceBinding" type="tns:TestServicePortType">
+    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
+    <operation name="test">
+      <soap:operation soapAction="Add" style="rpc" />
+      <input>
+        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />
+      </input>
+    </operation>
+  </binding>
+
+  <service name="TestService">
+    <port name="TestServicePort" binding="tns:TestServiceBinding">
+      <soap:address location="http://linuxsrv.home/~dmitry/soap/soap_server.php" />
+    </port>
+  </service>
+
+</definitions>