PEAR:SOAP remote invocation of DOMDocument schemaValidateSource function BUG
| From: | Samuel Zallocco | Date: | Wed, 15 Feb 2006 10:15:39 +0000 |
| Subject: | PEAR:SOAP remote invocation of DOMDocument schemaValidateSource function BUG | ||
| Groups: | php.soap | ||
| Request: | Send a blank email to php-soap+get-2130@lists.php.net to get a copy of this message | ||
Hi,
I'm newly here boring you with my PHP5 problem ;-).....
I've a problem with a remote invocation (via PEAR::SOAP) of the method schemaValidateSource of DOMDocument Object.
I Have the following SW configuration:
Windows XP Home SP2
Apache 2
PHP 5.1.1
libxml/libxml2 2.6.11
libxslt 1.1.7
libexslt 0.8.5
DOM/XML API 20031129
And
C:\PHP>pear list
INSTALLED PACKAGES, CHANNEL PEAR.PHP.NET:
=========================================
PACKAGE VERSION STATE Archive_Tar 1.3.1 stable Console_Getopt 1.2 stable DB 1.7.6 stable HTTP_Request 1.3.0 stable Mail 1.1.9 stable Mail_Mime 1.3.1 stable Net_DIME 0.3 beta Net_SMTP 1.2.8 stable Net_Socket 1.0.6 stable Net_URL 1.0.14 stable PEAR 1.4.6 stable PHPUnit 1.3.2 stable SOAP 0.9.3 beta UDDI 0.2.0alpha4 alpha XML_Parser 1.2.7 stable XML_RPC 1.4.5 stableI have the SOAP server: __________________________________________________________________________ <?php require_once('SOAP/Server.php'); require_once('SOAP/Disco.php'); class pearsoaptest { public $__dispatch_map = array(); public function __construct() { $this->__dispatch_map['validate_pmif_from_xml_schema'] = array('in' => array('model' => 'String'), 'out' => array('validated' => 'Boolean'), ); } public function validate_pmif_from_xml_schema($model) { $_lres = FALSE; $schema = file_get_contents("http://www.perfeng.com/pmif/pmifschema.xsd"); // The following line will load a local backup copy of pmifschema.xsd if the previous instruction return FALSE // it was tested by me and works fine $schema = $schema ? $schema : file_get_contents("http://www.scienze.univaq.it/Zallocco.Samuel/pmifschema.xsd"); if ($schema) { $dom_model = DOMDocument::loadXML($model); if ($dom_model) {
// the instruction that fail is the following one:$_lres = $dom_model->schemaValidateSource($schema); // if you disable the previous instruction the code will work fine //$_lres = TRUE; // For example // So I deduced that the call to schemaValidateSource will rise some kind // of fatal error that return an invalid HTTP response to SOAP client } else { // something } } else { // something } return $_lres; } } // Thanks to Harlan Iverson <hjiverson@plauditdesign.com> of php.soap newsgroup // on news://news.php.net for this "sessions" slice of code! // Whitout the session use the client have no way to access class variable from method invocation!! session_start(); $server =& $_SESSION['server']; if( !isset( $server ) ) {
$server = new SOAP_Server();
$webservice = new pearsoaptest();
$server->addObjectMap( $webservice, 'http://schemas.xmlsoap.org/soap/envelope/' );
}
// Thanks a lot Harlan! You save me!
if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']=='POST') {
$server->service($HTTP_RAW_POST_DATA);} else { $disco = new SOAP_DISCO_Server($server,'pearsoaptest'); header("Content-type: text/xml"); if (isset($_SERVER['QUERY_STRING']) && (strcasecmp($_SERVER['QUERY_STRING'],'wsdl') == 0) ) { echo $disco->getWSDL(); } else {
header("Content-type: text/xml");
echo $disco->getDISCO();
}} exit; ?> __________________________________________________________________________ And the client: __________________________________________________________________________ #!/usr/local/bin/php <?php /* NOTICE: In my php.ini file I have set to report all error to a a file */ require_once 'SOAP/Client.php'; class pearsoaptest { public $__dispatch_map = array(); public function __construct() { $this->__dispatch_map['validate_pmif_from_xml_schema'] = array('in' => array('model' => 'String'), 'out' => array('validated' => 'Boolean'), ); } public function validate_pmif_from_xml_schema($model) { $_lres = FALSE; $schema = file_get_contents("http://www.perfeng.com/pmif/pmifschema.xsd"); // The following line will load a local backup copy of pmifschema.xsd if the previous instruction return FALSE // it was tested by me and works fine $schema = $schema ? $schema : file_get_contents("http://www.scienze.univaq.it/Zallocco.Samuel/pmifschema.xsd"); if ($schema) { $dom_model = DOMDocument::loadXML($model); if ($dom_model) {
// the instruction that fail is the following one:$_lres = $dom_model->schemaValidateSource($schema); // if you disable the previous instruction the code will work fine //$_lres = TRUE; // For example // So I deduced that the call to schemaValidateSource will rise some kind // of fatal error that return an invalid HTTP response to SOAP client } else { // something } } else { // something } return $_lres; } } try { // A local invocation of pearsoaptest CLASS will produce the correct output $obj = new pearsoaptest(); $ret = $obj->validate_pmif_from_xml_schema(file_get_contents("http://www.scienze.univaq.it/Zallocco.Samuel/pmifexample.xml")); echo "\nValidated: " , ($ret?"TRUE":"FALSE") , " -> " , $ret; // Remote SOAP Invocation of pearsoaptest CLASS will produce an incorrect HTTP response $_web_service_url = 'http://localhost/pearsoaptestserver.php?wsdl'; $wsdl = new SOAP_WSDL($_web_service_url); $pearsoaptest = $wsdl->getProxy(); $ret = $pearsoaptest->validate_pmif_from_xml_schema(file_get_contents("http://www.scienze.univaq.it/Zallocco.Samuel/pmifexample.xml")); if (PEAR::isError($ret)) { echo "\n\nError: " , $ret->getMessage() , "\n"; } else { echo "\n\nValidated: " , ($ret?"TRUE":"FALSE") , " -> " , $ret; }; } catch (Exception $e) {
echo '\n\nCaught exception: ', $e->getMessage(), "\n";} echo "\n\n"; ?> __________________________________________________________________________ As you can see running the code, the local invocation of the method validate_pmif_from_xml_schema produce the correct response but when called via the PEAR:SOAP protocol it will fail with an invalid HTTP Response. I have no idea about the source of the problem!! Can you help me in some way?? Thank you. PS1: You can download the full code, pmif example and schema from: http://www.scienze.univaq.it/Zallocco.Samuel/pear-soap-test.zip PS2: PMIF aka Permormance Model Interchange Format