Edit report at http://bugs.php.net/bug.php?id=45966&edit=1

 ID:               45966
 Comment by:       ccorliss at gmail dot com
 Reported by:      chammers at netcologne dot de
 Summary:          SoapServer does not report WSDL validation errors
 Status:           No Feedback
 Type:             Bug
 Package:          SOAP related
 Operating System: Linux
 PHP Version:      5.2.6

 New Comment:

Despite the comment below, this issue is still not fixed in 5.3.2. 
Missing 

required elements are quietly skipped.


Previous Comments:
------------------------------------------------------------------------
[2009-05-03 01:00:17] php-bugs at lists dot php dot net

No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".

------------------------------------------------------------------------
[2009-04-25 16:24:34] j...@php.net

Please try using this CVS snapshot:

  http://snaps.php.net/php5.2-latest.tar.gz
 
For Windows:

  http://windows.php.net/snapshots/



------------------------------------------------------------------------
[2008-09-01 17:24:00] chammers at netcologne dot de

Description:
------------
When receiving a SOAP request, SoapServer does not properly validate if
it matches the given WSDL. 



Invalid elements are simply surpressed and not passed through to the
called function.



I would expect the SoapServer->handler() to raise an Exception so that
the program can decide if it terminates or go ahead with all parameters
it can get.



bye,



-christian-

Reproduce code:
---------------
<?php

ini_set("soap.wsdl_cache_enabled", "0");



class DummyClass {

    public function __call($name, $arguments) {

        fprintf(STDERR, "Method $name was called with
".var_export($arguments, 1)."\n");

    }

}



$HTTP_RAW_POST_DATA = <<<EOF

<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope 

    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; 

    xmlns:ns1="http://www.foo.de/services/exampleService";>

<SOAP-ENV:Body>

    <ns1:exampleRequest>

        <aaaa>1000</aaaa>

        <bbb>815</bbb>

    </ns1:exampleRequest>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>





EOF;



$server = new SoapServer("chammers.wsdl");

$server->setClass('DummyClass');

$server->handle($HTTP_RAW_POST_DATA);

########################################################################







And the WSDL (here "chammers.wsdl")











<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions

    xmlns:http="http://schemas.xmlsoap.org/wsdl/http/";

    xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/";

    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";

    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/";

    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";

    xmlns:tns="http://www.foo.de/services/exampleService";

    targetNamespace="http://www.foo.de/services/exampleService";>

    

    <!-- ==== TYPES ==== -->

    <wsdl:types>

        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 

                   
targetNamespace="http://www.foo.de/services/exampleService";>

            <xsd:element name="exampleRequest">

                <xsd:complexType>

                    <xsd:sequence>

                        <xsd:element name="aaa" type="xsd:int"/>

                        <xsd:element name="bbb" type="xsd:int"/>

                    </xsd:sequence>

                </xsd:complexType>

            </xsd:element>

        </xsd:schema>

    </wsdl:types>   

    

    <!-- ==== MESSAGE ==== -->

    <wsdl:message name="exampleRequestMessage">

        <wsdl:part name="body" element="tns:exampleRequest"/>

    </wsdl:message>

    

    <!-- ==== PORTTYPE ==== -->

    <wsdl:portType name="examplePortType">

        <wsdl:operation name="example">            

            <wsdl:input message="tns:exampleRequestMessage"/>

        </wsdl:operation>

    </wsdl:portType>

    

    <!-- ==== BINDING ==== -->

    <wsdl:binding name="exampleBinding" type="tns:examplePortType">

        <soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="example">

            <soap:operation
soapAction="http://soap.foo.de/services/example"/>

            <wsdl:input>

                <soap:body use="literal" />

            </wsdl:input>       

        </wsdl:operation>

    </wsdl:binding>

    

    <!-- ==== SERVICE ==== -->

    <wsdl:service name="exampleServices">

        <wsdl:port name="examplePortType" binding="tns:exampleBinding">

            <soap:address
location="http://localhost:4080/services/exampleServices"/>

        </wsdl:port>

    </wsdl:service>

        

</wsdl:definitions>









Expected result:
----------------
As the request parameter "aaa" has a typo and is actually written as
"aaaa" I would expect an Exception or at least some kind of warning.





Actual result:
--------------
... but the handler class just gets the "bbb" parameter:





$ php chammers.php 

Method example was called with array (

  0 => 

  stdClass::__set_state(array(

     'bbb' => 815,

  )),

)




------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=45966&edit=1

Reply via email to