From:             ckl at ecw dot de
Operating system: Windows XP SP3
PHP version:      5.2.11
PHP Bug Type:     SOAP related
Bug description:  SOAP response by is not encoded

Description:
------------
I developed a Spring-WS webservice which I try to call by PHP.
WSDL file:
---
<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/";
xmlns:sch="http://www.ecw.de/adg/person/schema/beans";
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/";
xmlns:tns="http://www.ecw.de/adg/person/schema/beans";
targetNamespace="http://www.ecw.de/adg/person/schema/beans";>
  <wsdl:types>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb";
xmlns="http://www.ecw.de/adg/person/schema/beans";
xmlns:pb="http://www.ecw.de/adg/person/schema/beans";
xmlns:schemas="http://www.ecw.de/adg/person/schema/beans";
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc";
attributeFormDefault="unqualified" elementFormDefault="unqualified"
jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"
targetNamespace="http://www.ecw.de/adg/person/schema/beans";
xmlns:tns="http://www.ecw.de/adg/person/schema/beans";>
        <xs:annotation>
                <xs:appinfo>
                        <jaxb:globalBindings>
                                <xjc:simple/>
                        </jaxb:globalBindings>
                </xs:appinfo>

        </xs:annotation>

        <xs:complexType name="person">
                <xs:sequence>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="canonicalName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="commonName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="createTimeStamp"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="description"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="name" 
nillable="true"
type="xs:string"/>

                        <xs:element maxOccurs="1" minOccurs="1" 
name="objectCategory"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="whenCreated"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="distinguishedName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="mail" 
nillable="true"
type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="displayName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="objectClass"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="sAMAccountName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="memberOf" 
nillable="true"
type="pb:groupCollection"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="employeeNumber"
nillable="true" type="xs:string"/>

                        <xs:element maxOccurs="1" minOccurs="1" name="givenName"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="0" 
name="homeDirectory"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="homePhone"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" name="lastLogon"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="logonCount"
nillable="true" type="xs:int"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="mailNickname"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="allowDialin"
nillable="true" type="xs:boolean"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="profilePath"
nillable="true" type="xs:string"/>
                        <xs:element maxOccurs="1" minOccurs="1" 
name="userPrincipalName"
nillable="true" type="xs:string"/>

                        <xs:element maxOccurs="1" minOccurs="1" 
name="additionalAttributes"
nillable="true" type="pb:additionalAttributesCollectionType"/>
                </xs:sequence>
        </xs:complexType>

        <xs:complexType name="groupCollection">
                <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" 
name="groupName"
type="xs:string"/>
                </xs:sequence>
        </xs:complexType>

        <xs:complexType name="additionalAttributesCollectionType">
                <xs:sequence>
                        <xs:element maxOccurs="unbounded" minOccurs="0" 
name="attribute"
nillable="false" type="pb:additionalAttributeType">
                        </xs:element>
                </xs:sequence>
        </xs:complexType>

        <xs:complexType name="additionalAttributeType">
                <xs:sequence>

                        <xs:element maxOccurs="1" minOccurs="1" name="value"
type="xs:string"/>
                </xs:sequence>
                <xs:attribute name="name" type="xs:string" use="required"/>
        </xs:complexType>

        <xs:complexType name="defaultAuthenticationResponse">
                <xs:sequence>
                        <xs:element default="false" maxOccurs="1" minOccurs="1" 
name="valid"
nillable="false" type="xs:boolean"/>
                        <xs:element default="0" minOccurs="0" name="statusCode" 
nillable="true"
type="xs:integer"/>

                        <xs:element maxOccurs="1" minOccurs="0" name="reason" 
nillable="true"
type="xs:string"/>
                </xs:sequence>
        </xs:complexType>


        <xs:element name="findUserRequest">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element name="sAMAccountName" 
type="xs:string"/>
                        </xs:sequence>

                </xs:complexType>
        </xs:element>
        <xs:element name="findUserResponse">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element name="person" type="pb:person"/>
                        </xs:sequence>
                </xs:complexType>
        </xs:element>

        <xs:element name="isUserAAARequest">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element maxOccurs="1" minOccurs="1" 
name="sAMAccountName"
nillable="false" type="xs:string"/>
                                <xs:element maxOccurs="1" minOccurs="1" 
name="credential"
nillable="false" type="xs:string"/>
                                <xs:element maxOccurs="1" minOccurs="1" 
name="neededGroups"
nillable="false" type="pb:groupCollection"/>
                                <xs:element maxOccurs="1" minOccurs="1"
name="memberShipIsNeededInAllGroups" nillable="false" type="xs:boolean"/>
                        </xs:sequence>

                </xs:complexType>
        </xs:element>
        <xs:element name="isUserAAAResponse"
type="pb:defaultAuthenticationResponse"/>

        <xs:element name="isUserAuthenticatedRequest">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element maxOccurs="1" minOccurs="0" 
name="sAMAccountName"
nillable="false" type="xs:string"/>
                                <xs:element maxOccurs="1" minOccurs="1" 
name="credential"
nillable="false" type="xs:string"/>

                        </xs:sequence>
                </xs:complexType>
        </xs:element>
        <xs:element name="isUserAuthenticatedResponse"
type="pb:defaultAuthenticationResponse"/>

        <xs:element name="isUserAuthorizedRequest">
                <xs:complexType>
                        <xs:sequence>
                                <xs:element maxOccurs="1" minOccurs="0" 
name="sAMAccountName"
nillable="false" type="xs:string"/>

                                <xs:element maxOccurs="1" minOccurs="1" 
name="neededGroups"
nillable="false" type="pb:groupCollection"/>
                                <xs:element maxOccurs="1" minOccurs="1"
name="memberShipIsNeededInAllGroups" nillable="false" type="xs:boolean"/>

                        </xs:sequence>
                </xs:complexType>
        </xs:element>
        <xs:element name="isUserAuthorizedResponse"
type="pb:defaultAuthenticationResponse"/>
</xs:schema>
  </wsdl:types>
  <wsdl:message name="isUserAuthenticatedRequest">

    <wsdl:part element="tns:isUserAuthenticatedRequest"
name="isUserAuthenticatedRequest">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="findUserResponse">
    <wsdl:part element="tns:findUserResponse" name="findUserResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="findUserRequest">
    <wsdl:part element="tns:findUserRequest" name="findUserRequest">

    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="isUserAuthorizedResponse">
    <wsdl:part element="tns:isUserAuthorizedResponse"
name="isUserAuthorizedResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="isUserAAAResponse">
    <wsdl:part element="tns:isUserAAAResponse" name="isUserAAAResponse">
    </wsdl:part>

  </wsdl:message>
  <wsdl:message name="isUserAuthenticatedResponse">
    <wsdl:part element="tns:isUserAuthenticatedResponse"
name="isUserAuthenticatedResponse">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="isUserAAARequest">
    <wsdl:part element="tns:isUserAAARequest" name="isUserAAARequest">
    </wsdl:part>
  </wsdl:message>

  <wsdl:message name="isUserAuthorizedRequest">
    <wsdl:part element="tns:isUserAuthorizedRequest"
name="isUserAuthorizedRequest">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="Person">
    <wsdl:operation name="isUserAAA">
      <wsdl:input message="tns:isUserAAARequest" name="isUserAAARequest">
    </wsdl:input>
      <wsdl:output message="tns:isUserAAAResponse"
name="isUserAAAResponse">

    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="isUserAuthorized">
      <wsdl:input message="tns:isUserAuthorizedRequest"
name="isUserAuthorizedRequest">
    </wsdl:input>
      <wsdl:output message="tns:isUserAuthorizedResponse"
name="isUserAuthorizedResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="findUser">

      <wsdl:input message="tns:findUserRequest" name="findUserRequest">
    </wsdl:input>
      <wsdl:output message="tns:findUserResponse"
name="findUserResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="isUserAuthenticated">
      <wsdl:input message="tns:isUserAuthenticatedRequest"
name="isUserAuthenticatedRequest">
    </wsdl:input>
      <wsdl:output message="tns:isUserAuthenticatedResponse"
name="isUserAuthenticatedResponse">

    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="PersonSoap11" type="tns:Person">
    <soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="isUserAAA">
      <soap:operation soapAction=""/>
      <wsdl:input name="isUserAAARequest">
        <soap:body use="literal"/>

      </wsdl:input>
      <wsdl:output name="isUserAAAResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="isUserAuthorized">
      <soap:operation soapAction=""/>
      <wsdl:input name="isUserAuthorizedRequest">
        <soap:body use="literal"/>

      </wsdl:input>
      <wsdl:output name="isUserAuthorizedResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="findUser">
      <soap:operation soapAction=""/>
      <wsdl:input name="findUserRequest">
        <soap:body use="literal"/>

      </wsdl:input>
      <wsdl:output name="findUserResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="isUserAuthenticated">
      <soap:operation soapAction=""/>
      <wsdl:input name="isUserAuthenticatedRequest">
        <soap:body use="literal"/>

      </wsdl:input>
      <wsdl:output name="isUserAuthenticatedResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="PersonService">
    <wsdl:port binding="tns:PersonSoap11" name="PersonSoap11">
      <soap:address location="http://localhost:8080/ADG/personService"/>

    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>
---

Response from Spring-WS (fetched by proxying the request/response):
---
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/";>
   <SOAP-ENV:Header/>
   <SOAP-ENV:Body>
      <ns3:person xmlns:ns3="http://www.ecw.de/adg/person/schema/beans";>
         <canonicalName xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <commonName xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <createTimeStamp xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <description>desc</description>
         <name>name</name>
        
<objectCategory>CN=Person,CN=Schema,CN=Configuration,DC=dc,DC=com</objectCategory>
         <whenCreated>200000000</whenCreated>
         <distinguishedName>CN=...</distinguishedName>
         <mail>m...@domain.com</mail>
         <displayName>display-name</displayName>
         <objectClass>top</objectClass>
         <sAMAccountName>test</sAMAccountName>
         <memberOf>
            <groupName>Some groupname</groupName>
         </memberOf>
         <employeeNumber>123</employeeNumber>
         <givenName>test</givenName>
         <homePhone xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
         <lastLogon>129017292450890526</lastLogon>
         <logonCount>7021</logonCount>
         <mailNickname>test</mailNickname>
         <allowDialin>false</allowDialin>
         <profilePath>\\srv\profiles</profilePath>
         <userPrincipalName>t...@domain.com</userPrincipalName>
         <additionalAttributes xsi:nil="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
      </ns3:person>
   </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
---

It seems to be that SOAPClient or the underlying XML library (SimpleXML? -
not sure which XML-library is used by SOAPClient) is not able to handle the
namespaces in response.

Reproduce code:
---------------
<?php
define('WSDL', 'path_to_wsdl');

// tried already all possible combinations with and without uri
$client = new SoapClient(WSDL, array('trace' => true, 'version' =>
SOAP_1_1, 'exceptions' => true, 'uri' =>
'http://www.ecw.de/adg/person/schema/beans'));

$func = "findUser"
$req['findUserRequest']['sAMAccountName'] = 'test';

// tried already all possible combinations with and without uri
$result = $client->__soapCall($func, $req, array('uri' =>
"http://www.ecw.de/adg/person/schema/beans";));

print_r($result); // results in NULL and *not* object
?>

Expected result:
----------------
expected: object { name = 'test' , .... }


Actual result:
--------------
NULL

-- 
Edit bug report at http://bugs.php.net/?id=50064&edit=1
-- 
Try a snapshot (PHP 5.2):            
http://bugs.php.net/fix.php?id=50064&r=trysnapshot52
Try a snapshot (PHP 5.3):            
http://bugs.php.net/fix.php?id=50064&r=trysnapshot53
Try a snapshot (PHP 6.0):            
http://bugs.php.net/fix.php?id=50064&r=trysnapshot60
Fixed in SVN:                        
http://bugs.php.net/fix.php?id=50064&r=fixed
Fixed in SVN and need be documented: 
http://bugs.php.net/fix.php?id=50064&r=needdocs
Fixed in release:                    
http://bugs.php.net/fix.php?id=50064&r=alreadyfixed
Need backtrace:                      
http://bugs.php.net/fix.php?id=50064&r=needtrace
Need Reproduce Script:               
http://bugs.php.net/fix.php?id=50064&r=needscript
Try newer version:                   
http://bugs.php.net/fix.php?id=50064&r=oldversion
Not developer issue:                 
http://bugs.php.net/fix.php?id=50064&r=support
Expected behavior:                   
http://bugs.php.net/fix.php?id=50064&r=notwrong
Not enough info:                     
http://bugs.php.net/fix.php?id=50064&r=notenoughinfo
Submitted twice:                     
http://bugs.php.net/fix.php?id=50064&r=submittedtwice
register_globals:                    
http://bugs.php.net/fix.php?id=50064&r=globals
PHP 4 support discontinued:          http://bugs.php.net/fix.php?id=50064&r=php4
Daylight Savings:                    http://bugs.php.net/fix.php?id=50064&r=dst
IIS Stability:                       
http://bugs.php.net/fix.php?id=50064&r=isapi
Install GNU Sed:                     
http://bugs.php.net/fix.php?id=50064&r=gnused
Floating point limitations:          
http://bugs.php.net/fix.php?id=50064&r=float
No Zend Extensions:                  
http://bugs.php.net/fix.php?id=50064&r=nozend
MySQL Configuration Error:           
http://bugs.php.net/fix.php?id=50064&r=mysqlcfg

Reply via email to