Bug #73043 [Com]: WSDL: import schema if WSDL uri does NOT end with a slash
| From: | filip dot rydlo at gmail dot com | Date: | Fri, 09 Sep 2016 14:22:37 +0000 |
| Subject: | Bug #73043 [Com]: WSDL: import schema if WSDL uri does NOT end with a slash | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-203921@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73043&edit=1
ID: 73043
Comment by: filip dot rydlo at gmail dot com
Reported by: filip dot rydlo at gmail dot com
Summary: WSDL: import schema if WSDL uri does NOT end with a
slash
Status: Not a bug
Type: Bug
Package: SOAP related
Operating System: Debian 8.5 Jessie x64
PHP Version: 5.6.26RC1
Block user comment: N
Private report: N
New Comment:
Unfortunatelly: Yes, I am.
I have common sense. So, sadly, this simple fix was, of course, the *first* thing I have tried!
Try the fixed link in a web browser for yourself. The original link does.
It does NOT work as of today: 2016-09-09T16:20:00+0200 :
https://pg.eet.cz/eet/services/EETServiceSOAP/v3/?wsdl
Previous Comments:
------------------------------------------------------------------------
[2016-09-09 14:06:59] requinix@php.net
>> however PHP is behaving correctly.
>Are You *absolutely* sure about all this?
As I said, I welcome any evidence or documentation or such indicating the opposite, but I'm
quite sure I'm right.
Are *you* sure that you have the correct WSDL URL? Try using /v3/?wsdl in your code instead - I bet
it will work.
------------------------------------------------------------------------
[2016-09-09 13:20:16] filip dot rydlo at gmail dot com
I would like to apologize to my government.
"millions of dollars" was of course clearly an *overstatement* from me.
I believe it could have cost several tens of thousands dollars, maybe up to one houndred thousand
USD. And mainly just because of the expensive infrastructure (a powerful dedicated server for the
EET webservice is definitely needed. It will need to consume lots of data daily).
------------------------------------------------------------------------
[2016-09-09 12:42:15] filip dot rydlo at gmail dot com
>> they are properly defined in the WSDL file
> I disagree.
Oh, NO! This cannot be. Can't be real! Sorry, that I am so shocked. But ... I just can't
believe this is happening!!
This WSDL is given to us, developers, by out government! It HAS TO BE correct and absolutely without
any error. :-(((
Considering how many millions of dollars it has *undoubtedly* cost us, the tax payers! It has to be
*perfect* , or we have NO chance ever implementing this webservice
(Which would/will, btw, help our country a lot, adding at least 0.5 billions of USD annually into
the state fund + probably even much more on taxes collected! )
---
Yes, I am pretty familiar with web development (13 years). Yet, I only was suspecting (feeling)
this, but NOT logically/consciously KNOW *this*.
And I would never suspect/expect an error in the WSDL given by the government in the first place!
---
> however PHP is behaving correctly.
Are You *absolutely* sure about all this?
Then please: Tell (explain) this to the government!
Thank You soooooooooooo much :-)
------------------------------------------------------------------------
[2016-09-08 04:10:00] requinix@php.net
> they are properly defined in the WSDL file
I disagree.
The XSD 1.1 Part 1 specification says [1]
> 4. When schema location values (i.e. schemaLocation attributes on ...<import>...)
> are... relative references, then the [base URI] of the [owner element] must be
> used to resolve the relative references.
In your example, the "owner" is the source WSDL document and the "base URI" is
https://pg.eet.cz/eet/services/EETServiceSOAP/v3?wsdl.
Unfortunately uncited in the XSD spec, RFC 3986 is what details [2] how to resolve relative
references, and if you're familiar with web development then you should already know that a
reference "a" relative to a base "b/c?d" resolves to "b/a", while
relative to "b/c/?d" resolves to "b/c/a". The trailing slash is very
significant.
Therefore "EETXMLSchema.xsd" relative to "https://pg.eet.cz/eet/services/EETServiceSOAP/v3?wsdl"
resolves to "https://pg.eet.cz/eet/services/EETServiceSOAP/EETXMLSchema.xsd".
Clearly this is not the intent of the WSDL's author, however PHP is behaving correctly. Can you
provide any references to suggest otherwise?
[1] https://www.w3.org/TR/xmlschema11-1/#schema-loc
[2] https://www.ietf.org/rfc/rfc3986.txt section
5.2
------------------------------------------------------------------------
[2016-09-07 21:02:11] filip dot rydlo at gmail dot com
Description:
------------
When loading WSDL:
PHP SoapClient FAILs to find *.XSD files despite the fact that they are properly defined in the WSDL
file downloaded from the server. They are defined like this:
<wsdl:definitions ...
...
<wsdl:types>
<xsd:schema>
<xsd:import namespace="http://fs.mfcr.cz/eet/schema/v3"
schemaLocation="EETXMLSchema.xsd"/>
</xsd:schema>
</wsdl:types>
...
WSDL addr. : https://pg.eet.cz/eet/services/EETServiceSOAP/v3?wsdl
Test script:
---------------
<?php
define('WSDL', 'https://pg.eet.cz:443/eet/services/EETServiceSOAP/v3?wsdl');
// EET srvr NETOLERUJE koncove '/' za "v3"!!!
define('ENDPOINT_LOCATION', 'https://pg.eet.cz:443/eet/services/EETServiceSOAP/v3/');
// NETOLERUJE koncove '/', bacha!
$options= array(
'cache_wsdl' => WSDL_CACHE_NONE,
'encoding' => 'utf-8',
'soap_version' => SOAP_1_1,
'exceptions' => true,
'trace' => 1,
'location' => ENDPOINT_LOCATION
);
$test_msg= "<EmptyTest>NODATA</EmptyTest>";
$input_args= new SoapVar($test_msg, XSD_ANYXML);
try
{
xdebug_disable();
//-------------------------------------
$soap= new SoapClient(WSDL, $options);
//-------------------------------------
xdebug_enable();
xdebug_disable();
$out = $soap->__soapCall('OdeslaniTrzby', array($input_args), $options, null,
$output_headers);
xdebug_enable();
echo("<br />REQUEST :<br />".
htmlspecialchars($eet->__getLastRequest()) ."<br />");
echo("<br />RESPONSE:<br />".
htmlspecialchars($eet->__getLastResponse()) ."<br />");
}
catch (SoapFault $fault)
{
xdebug_enable();
echo "Error:<br />" . nl2br($fault->faultcode) . '<br /><br
/>Error Details:<br />'. nl2br($fault->faultstring) . '<br />';
}
Expected result:
----------------
REQUEST : <dumped-xml-request..........>
In short:
It should successfully import the XSD schema from the correct location - DESPITE the webservice
location does NOT end with a slash "/".
In short: It should have looked for it here:
https://pg.eet.cz:443/eet/services/EETServiceSOAP/v3/EETXMLSchema.xsd
NOT here:
https://pg.eet.cz:443/eet/services/EETServiceSOAP/EETXMLSchema.xsd
Actual result:
--------------
PHP Fatal error: SOAP-ERROR: Parsing Schema: can't import schema from 'https://pg.eet.cz:443/eet/services/EETServiceSOAP/EETXMLSchema.xsd'
in /home/username/EET/src/testscript.php on line 21
Error:
WSDL
Error Details:
SOAP-ERROR: Parsing Schema: can't import schema from 'https://pg.eet.cz:443/eet/services/EETServiceSOAP/EETXMLSchema.xsd'
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73043&edit=1