php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #36908 wsdl default value overrides value in soap request
Submitted: 2006-03-29 12:39 UTC Modified: 2006-04-10 13:30 UTC
Votes:3
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:1 (50.0%)
From: amatunin at iponweb dot net Assigned: dmitry (profile)
Status: Closed Package: SOAP related
PHP Version: 5CVS-2006-03-29 (snap) OS: Linux Debian testing
Private report: No CVE-ID: None
 [2006-03-29 12:39 UTC] amatunin at iponweb dot net
Description:
------------
PHP SOAP server may parse SOAP request from client incorrectly if some variable in wsdl has a default value. I.e. value in the request gets ignored and the default value from WSDL is being used. Apparently the problem is being triggered by certain SOAP clients which generate SOAP packets with multiple references (for example Java's Asix does that). If WSDL doesn't define default values then PHP SOAP server parses exactly the same SOAP request correctly.

Reproduce code:
---------------
----test-server.php-----
<?php
class PublisherService {

  function add ($publisher) {
    return print_r ($publisher, true);
  }
}
$input =
'<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <ns1:add xmlns:ns1="urn:PublisherService" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
      <publisher href="#id0"/>
    </ns1:add>
    <multiRef xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns3="http://soap.dev/soap/types" id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:publisher">
      <region_id href="#id5"/>
    </multiRef>
    <multiRef xmlns:ns5="http://soap.dev/soap/types" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" id="id5" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="xsd:long">9</multiRef>
  </soapenv:Body>
</soapenv:Envelope>';
ini_set('soap.wsdl_cache_enabled', false);
$server = new SoapServer("wsdl.xml");
$server->setClass("PublisherService");
$server->handle($input);
?>

-------wsdl.xml--------
<?xml version="1.0"?>
<wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:api="http://soap.dev/soap/PublisherService" xmlns:types="http://soap.dev/soap/types" targetNamespace="http://soap.dev/soap/PublisherService">
  <wsdl:types>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:types="http://soap.dev/soap/types" targetNamespace="http://soap.dev/soap/types">
      <xsd:complexType name="publisher">
        <xsd:all>
          <xsd:element name="region_id" type="xsd:long" default="52"/>
        </xsd:all>
      </xsd:complexType>
    </xsd:schema> 
  </wsdl:types>
  <wsdl:message name="addInput">
    <wsdl:part name="publisher" type="types:publisher"/>
  </wsdl:message>
  <wsdl:message name="addOutput">
    <wsdl:part name="out" type="xsd:string"/>
  </wsdl:message>
  <wsdl:portType name="PublisherServicePortType">
    <wsdl:operation name="add">
      <wsdl:input message="api:addInput"/>
      <wsdl:output message="api:addOutput"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="PublisherServiceBinding" type="api:PublisherServicePortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="add">
      <soap:operation soapAction="urn:PublisherService#add" style="rpc"/>
      <wsdl:input>
        <soap:body use="encoded" namespace="urn:PublisherService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="encoded" namespace="urn:PublisherService" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="PublisherService">
    <wsdl:port name="PublisherServicePort" binding="api:PublisherServiceBinding">
      <soap:address location="http://soap.dev/soap//publisher_test.php"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>


Expected result:
----------------
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:PublisherService" 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><ns1:addResponse><out xsi:type="xsd:string">stdClass Object
(
    [region_id] =&gt; 9
)
</out></ns1:addResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Actual result:
--------------
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:PublisherService" 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><ns1:addResponse><out xsi:type="xsd:string">stdClass Object
(
    [region_id] =&gt; 52
)
</out></ns1:addResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2006-04-10 12:27 UTC] sniper@php.net
Assigned to the maintainer.
 [2006-04-10 13:30 UTC] dmitry@php.net
Fixed in CVS HEAD and PHP_5_1.

The problem was in XML reference handling.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 21 11:01:30 2024 UTC