PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » Web Services » SOAP » Bug #5815

missing parameters from WSDL

Details

Submitted2005-10-28 19:52 UTC
Frommartin at malditainternet dot com
Assignedyunosh
StatusNo Feedback
PackageSOAP
PHP Version4.4.0
OSlinux
Roadmaps(Not assigned)

Comments

[2005-10-28 19:52 UTC] martin at malditainternet dot com

Description:
------------
I've found that some parameters for operations defined in this WSDL are not well parsed by PEAR SOAP.
For example, the queryOption in GetListItems is not recognized/used as a valid param.

Test script:
---------------
<definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://schemas.microsoft.com/sharepoint/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<s:schema elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/sharepoint/soap/">
<s:import namespace="http://www.w3.org/2001/XMLSchema" />
<s:element name="GetListCollection">
<s:complexType />
</s:element>
<s:element name="GetListCollectionResponse">
<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetListCollectionResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>

</s:complexType>
</s:element>
<s:element name="DeleteList">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>

<s:element name="DeleteListResponse">
<s:complexType />
</s:element>
<s:element name="UpdateList">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="listProperties">
<s:complexType mixed="true">

<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="newFields">
<s:complexType mixed="true">
<s:sequence>
<s:any />

</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="updateFields">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>

</s:element>
<s:element minOccurs="0" maxOccurs="1" name="deleteFields">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="listVersion" type="s:string" />

</s:sequence>
</s:complexType>
</s:element>
<s:element name="UpdateListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="UpdateListResult">
<s:complexType mixed="true">
<s:sequence>

<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddList">
<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="description" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="templateID" type="s:int" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddListResponse">
<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="AddListResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>

</s:complexType>
</s:element>
<s:element name="GetListAndView">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
</s:sequence>
</s:complexType>

</s:element>
<s:element name="GetListAndViewResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetListAndViewResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>

</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetList">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />

</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetListResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetListResult">
<s:complexType mixed="true">
<s:sequence>

<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="DeleteAttachment">
<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="url" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="DeleteAttachmentResponse">
<s:complexType />

</s:element>
<s:element name="GetAttachmentCollection">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />
</s:sequence>
</s:complexType>
</s:element>

<s:element name="GetAttachmentCollectionResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetAttachmentCollectionResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>

</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddAttachment">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="listItemID" type="s:string" />

<s:element minOccurs="0" maxOccurs="1" name="fileName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="attachment" type="s:base64Binary" />
</s:sequence>
</s:complexType>
</s:element>
<s:element name="AddAttachmentResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="AddAttachmentResult" type="s:string" />

</s:sequence>
</s:complexType>
</s:element>
<s:element name="UpdateListItems">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="updates">
<s:complexType mixed="true">

<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="UpdateListItemsResponse">

<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="UpdateListItemsResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>

</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetListItemChanges">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="viewFields">
<s:complexType mixed="true">

<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="since" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="contains">
<s:complexType mixed="true">
<s:sequence>

<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetListItemChangesResponse">
<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetListItemChangesResult">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>

</s:complexType>
</s:element>
<s:element name="GetListItems">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="listName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="viewName" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="query">
<s:complexType mixed="true">

<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="viewFields">
<s:complexType mixed="true">
<s:sequence>
<s:any />

</s:sequence>
</s:complexType>
</s:element>
<s:element minOccurs="0" maxOccurs="1" name="rowLimit" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="queryOptions">
<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>

</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="GetListItemsResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="GetListItemsResult">

<s:complexType mixed="true">
<s:sequence>
<s:any />
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>

</s:schema>
</types>
<message name="GetListCollectionSoapIn">
<part name="parameters" element="s0:GetListCollection" />
</message>
<message name="GetListCollectionSoapOut">
<part name="parameters" element="s0:GetListCollectionResponse" />
</message>
<message name="DeleteListSoapIn">

<part name="parameters" element="s0:DeleteList" />
</message>
<message name="DeleteListSoapOut">
<part name="parameters" element="s0:DeleteListResponse" />
</message>
<message name="UpdateListSoapIn">
<part name="parameters" element="s0:UpdateList" />
</message>
<message name="UpdateListSoapOut">

<part name="parameters" element="s0:UpdateListResponse" />
</message>
<message name="AddListSoapIn">
<part name="parameters" element="s0:AddList" />
</message>
<message name="AddListSoapOut">
<part name="parameters" element="s0:AddListResponse" />
</message>
<message name="GetListAndViewSoapIn">

<part name="parameters" element="s0:GetListAndView" />
</message>
<message name="GetListAndViewSoapOut">
<part name="parameters" element="s0:GetListAndViewResponse" />
</message>
<message name="GetListSoapIn">
<part name="parameters" element="s0:GetList" />
</message>
<message name="GetListSoapOut">

<part name="parameters" element="s0:GetListResponse" />
</message>
<message name="DeleteAttachmentSoapIn">
<part name="parameters" element="s0:DeleteAttachment" />
</message>
<message name="DeleteAttachmentSoapOut">
<part name="parameters" element="s0:DeleteAttachmentResponse" />
</message>
<message name="GetAttachmentCollectionSoapIn">

<part name="parameters" element="s0:GetAttachmentCollection" />
</message>
<message name="GetAttachmentCollectionSoapOut">
<part name="parameters" element="s0:GetAttachmentCollectionResponse" />
</message>
<message name="AddAttachmentSoapIn">
<part name="parameters" element="s0:AddAttachment" />
</message>
<message name="AddAttachmentSoapOut">

<part name="parameters" element="s0:AddAttachmentResponse" />
</message>
<message name="UpdateListItemsSoapIn">
<part name="parameters" element="s0:UpdateListItems" />
</message>
<message name="UpdateListItemsSoapOut">
<part name="parameters" element="s0:UpdateListItemsResponse" />
</message>
<message name="GetListItemChangesSoapIn">

<part name="parameters" element="s0:GetListItemChanges" />
</message>
<message name="GetListItemChangesSoapOut">
<part name="parameters" element="s0:GetListItemChangesResponse" />
</message>
<message name="GetListItemsSoapIn">
<part name="parameters" element="s0:GetListItems" />
</message>
<message name="GetListItemsSoapOut">

<part name="parameters" element="s0:GetListItemsResponse" />
</message>
<portType name="ListsSoap">
<operation name="GetListCollection">
<input message="s0:GetListCollectionSoapIn" />
<output message="s0:GetListCollectionSoapOut" />
</operation>
<operation name="DeleteList">
<input message="s0:DeleteListSoapIn" />

<output message="s0:DeleteListSoapOut" />
</operation>
<operation name="UpdateList">
<input message="s0:UpdateListSoapIn" />
<output message="s0:UpdateListSoapOut" />
</operation>
<operation name="AddList">
<input message="s0:AddListSoapIn" />
<output message="s0:AddListSoapOut" />

</operation>
<operation name="GetListAndView">
<input message="s0:GetListAndViewSoapIn" />
<output message="s0:GetListAndViewSoapOut" />
</operation>
<operation name="GetList">
<input message="s0:GetListSoapIn" />
<output message="s0:GetListSoapOut" />
</operation>

<operation name="DeleteAttachment">
<input message="s0:DeleteAttachmentSoapIn" />
<output message="s0:DeleteAttachmentSoapOut" />
</operation>
<operation name="GetAttachmentCollection">
<input message="s0:GetAttachmentCollectionSoapIn" />
<output message="s0:GetAttachmentCollectionSoapOut" />
</operation>
<operation name="AddAttachment">

<input message="s0:AddAttachmentSoapIn" />
<output message="s0:AddAttachmentSoapOut" />
</operation>
<operation name="UpdateListItems">
<input message="s0:UpdateListItemsSoapIn" />
<output message="s0:UpdateListItemsSoapOut" />
</operation>
<operation name="GetListItemChanges">
<input message="s0:GetListItemChangesSoapIn" />

<output message="s0:GetListItemChangesSoapOut" />
</operation>
<operation name="GetListItems">
<input message="s0:GetListItemsSoapIn" />
<output message="s0:GetListItemsSoapOut" />
</operation>
</portType>
<binding name="ListsSoap" type="s0:ListsSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" />

<operation name="GetListCollection">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListCollection" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="DeleteList">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteList" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="UpdateList">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateList" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="AddList">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddList" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="GetListAndView">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListAndView" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="GetList">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetList" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="DeleteAttachment">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/DeleteAttachment" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="GetAttachmentCollection">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetAttachmentCollection" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="AddAttachment">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/AddAttachment" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="UpdateListItems">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/UpdateListItems" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="GetListItemChanges">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItemChanges" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

<operation name="GetListItems">
<soap:operation soapAction="http://schemas.microsoft.com/sharepoint/soap/GetListItems" style="document" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>

</binding>
<service name="Lists">
<port name="ListsSoap" binding="s0:ListsSoap">
<soap:address location="http://192.168.0.128/_vti_bin/Lists.asmx" />
</port>
</service>
</definitions>

Actual result:
--------------
this is the print_R output of the $wsdl->elements property (just the intresting part.)

[GetListItems] => Array
(
[name] => GetListItems
[namespace] => s0
[complex] => 1
[elements] => Array
(
[listName] => Array
(
[minOccurs] => 0
[maxOccurs] => 1
[name] => listName
[type] => string
[namespace] => s
)

[viewName] => Array
(
[minOccurs] => 0
[maxOccurs] => 1
[name] => viewName
[type] => string
[namespace] => s
)

[query] => Array
(
[minOccurs] => 0
[maxOccurs] => 1
[name] => query
[namespace] => s0
)

)

)

[2005-11-01 15:57 UTC] martin at malditainternet dot com

fixed

[2005-11-01 15:58 UTC] martin at malditainternet dot com

fixed, also uses CURL when available

--- SOAP_orig/WSDL.php 2005-05-30 19:12:11.000000000 -0300
+++ SOAP/WSDL.php 2005-11-01 12:22:53.000000000 -0300
@@ -907,7 +907,16 @@
} else {
$file_data = implode('',file($wsdl_fname));
}
- } else {
+ } elseif(extension_loaded('curl')){
+ $ch=curl_init();
+ curl_setopt($ch, CURLOPT_URL, $wsdl_fname);
+ //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ $file_data=curl_exec($ch);
+ if (!$file_data) {
+ return $this->_raiseSoapFault("Unable to retrieve WSDL $wsdl_fname, no http body", $wsdl_fname);
+ }
+ } else{
$uri = explode('?', $wsdl_fname);
$rq =& new HTTP_Request($uri[0], $proxy_params);
// the user agent HTTP_Request uses fouls things up
@@ -1088,7 +1097,11 @@
}
$this->schemaStatus = 'complexType';
} else {
- $this->wsdl->elements[$this->schema][$this->currentElement]['complex'] = true;
+ if (count($this->schema_element_stack) >= 2){
+ $this->wsdl->elements[$this->schema][$this->schema_element_stack[count($this->schema_element_stack) - 2]]['elements'][$this->currentElement]['complex'] = true;
+ }else{
+ $this->wsdl->elements[$this->schema][$this->currentElement]['complex'] = true;
+ }
}
break;

@@ -1646,11 +1659,13 @@
}
if (stristr($name, 'complexType')) {
$this->currentComplexType = '';
+/*
if (count($this->schema_element_stack)) {
$this->currentElement = array_pop($this->schema_element_stack);
} else {
$this->currentElement = '';
}
+*/
} elseif (stristr($name, 'element')) {
if (count($this->schema_element_stack)) {
$this->currentElement = array_pop($this->schema_element_stack);