summaryrefslogtreecommitdiff
path: root/ext/soap/interop
diff options
context:
space:
mode:
Diffstat (limited to 'ext/soap/interop')
-rw-r--r--ext/soap/interop/client_round2.php113
-rw-r--r--ext/soap/interop/client_round2_interop.php785
-rw-r--r--ext/soap/interop/client_round2_params.php622
-rw-r--r--ext/soap/interop/client_round2_results.php75
-rw-r--r--ext/soap/interop/client_round2_run.php53
-rw-r--r--ext/soap/interop/config.php.dist5
-rw-r--r--ext/soap/interop/database_round2.sql44
-rw-r--r--ext/soap/interop/echoheadersvc.wsdl.php398
-rw-r--r--ext/soap/interop/index.php59
-rw-r--r--ext/soap/interop/interop.wsdl.php336
-rw-r--r--ext/soap/interop/interopB.wsdl.php196
-rw-r--r--ext/soap/interop/server_round2_base.php105
-rw-r--r--ext/soap/interop/server_round2_groupB.php58
-rw-r--r--ext/soap/interop/server_round2_groupC.php43
-rw-r--r--ext/soap/interop/test.utility.php143
15 files changed, 3035 insertions, 0 deletions
diff --git a/ext/soap/interop/client_round2.php b/ext/soap/interop/client_round2.php
new file mode 100644
index 0000000..c130747
--- /dev/null
+++ b/ext/soap/interop/client_round2.php
@@ -0,0 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <title>Round 2 Interop Client Tests</title>
+</head>
+
+<body>
+<a href="index.php">Back to Interop Index</a><br>
+<p>&nbsp;</p>
+<?php
+require_once 'client_round2_interop.php';
+
+$iop = new Interop_Client();
+
+function endpointList($test,$sel_endpoint)
+{
+ global $iop;
+ $iop->getEndpoints($test);
+ echo "<select name='endpoint'>\n";
+ echo "<option value=''>-- All Endpoints --</option>\n";
+ foreach ($iop->endpoints as $epname => $epinfo) {
+ $selected = '';
+ if ($sel_endpoint == $epname) $selected = ' SELECTED';
+ echo "<option value='$epname'$selected>$epname</option>\n";
+ }
+ echo "</select>\n";
+}
+function methodList($test,$sel_method)
+{
+ global $iop;
+ global $soap_tests;
+
+ echo "<select name='method'>\n";
+ echo "<option value='ALL'>-- Run All Methods --</option>\n";
+ $prev_method = "";
+ foreach ($soap_tests[$test] as $x) {
+ $method = $x->test_name;
+ if ($method != $prev_method) {
+ $prev_method = $method;
+ $selected = '';
+ if ($sel_method == $method) $selected = ' SELECTED';
+ echo "<option value='$method'$selected>$method</option>\n";
+ }
+ }
+ echo "</select>\n";
+}
+
+function endpointTestForm($test, $endpoint, $method, $paramType, $useWSDL)
+{
+ global $PHP_SELF;
+ if (!$test) $test = 'base';
+ echo "Round 2 '$test' Selected<br>\n";
+ echo "Select endpoint and method to run:<br>\n";
+ echo "<form action='$PHP_SELF' method='post'>\n";
+ echo "<input type='hidden' name='test' value='$test'>\n";
+ endpointList($test, $endpoint);
+ methodList($test, $method);
+ echo "<select name='paramType'>";
+// echo "<option value='all'>-- All --</option>";
+ echo "<option value='soapval'".($paramType=='soapval'?' selected':'').">soap value</option>";
+ echo "<option value='php'".($paramType=='php'?' selected':'').">php internal type</option></select>\n";
+ echo "<select name='useWSDL'>";
+// echo "<option value='all'>-- All --</option>";
+ echo "<option value='0'>go Direct</option>";
+ echo "<option value='1'".($useWSDL?' selected':'').">use WSDL</option></select>\n";
+ echo "<input type='submit' value='Go'>\n";
+ echo "</form><br>\n";
+}
+
+function testSelectForm($selected_test = NULL)
+{
+ global $iop, $PHP_SELF;
+ echo "Select a Round 2 test case to run:<br>\n";
+ echo "<form action='$PHP_SELF' method='post'>\n";
+ echo "<select name='test'>\n";
+ foreach ($iop->tests as $test) {
+ $selected = '';
+ if ($selected_test == $test) $selected = ' SELECTED';
+ echo "<option value='$test'$selected>$test</option>\n";
+ }
+ echo "</select>\n";
+ echo "<input type='submit' value='Go'>\n";
+ echo "</form><br>\n";
+}
+
+testSelectForm($_POST['test']);
+endpointTestForm($_POST['test'],$_POST['endpoint'],$_POST['method'],$_POST['paramType'],$_POST['useWSDL']);
+
+if ($_POST['test'] && array_key_exists('endpoint', $_POST) && array_key_exists('method', $_POST)) {
+ // here we execute the orders
+ echo "<h2>Calling {$_POST['method']} at {$_POST['endpoint']}</h2>\n";
+ echo "NOTE: wire's are slightly modified to display better in web browsers.<br>\n";
+
+ $iop->currentTest = $_POST['test']; // see $tests above
+ $iop->paramType = $_POST['paramType']; // 'php' or 'soapval'
+ $iop->useWSDL = $_POST['useWSDL']; // 1= do wsdl tests
+ $iop->numServers = 0; // 0 = all
+ $iop->specificEndpoint = $_POST['endpoint']; // test only this endpoint
+ $iop->testMethod = $_POST['method']=='ALL'?'':$_POST['method']; // test only this method
+ $iop->skipEndpointList = array(); // endpoints to skip
+ $iop->nosave = 0; // 1= disable saving results to database
+ // debug output
+ $iop->show = 0;
+ $iop->debug = 0;
+ $iop->showFaults = 0; // used in result table output
+ echo '<pre>';
+ $iop->doTest(); // run a single set of tests using above options
+ echo '</pre>';
+}
+?>
+</body>
+</html>
diff --git a/ext/soap/interop/client_round2_interop.php b/ext/soap/interop/client_round2_interop.php
new file mode 100644
index 0000000..5b97873
--- /dev/null
+++ b/ext/soap/interop/client_round2_interop.php
@@ -0,0 +1,785 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+require_once 'DB.php'; // PEAR/DB
+require_once 'client_round2_params.php';
+require_once 'test.utility.php';
+require_once 'config.php';
+
+error_reporting(E_ALL ^ E_NOTICE);
+
+class Interop_Client
+{
+ // database DNS
+ var $DSN = "";
+
+ var $baseURL = "";
+
+ // our central interop server, where we can get the list of endpoints
+ var $interopServer = "http://www.whitemesa.net/wsdl/interopInfo.wsdl";
+
+ // our local endpoint, will always get added to the database for all tests
+ var $localEndpoint;
+
+ // specify testing
+ var $currentTest = 'base'; // see $tests above
+ var $paramType = 'php'; // 'php' or 'soapval'
+ var $useWSDL = 0; // 1= do wsdl tests
+ var $numServers = 0; // 0 = all
+ var $specificEndpoint = ''; // test only this endpoint
+ var $testMethod = ''; // test only this method
+ var $skipEndpointList = array(); // endpoints to skip
+ var $nosave = 0;
+ var $startAt = ''; // start in list at this endpoint
+ // debug output
+ var $show = 1;
+ var $debug = 0;
+ var $showFaults = 0; // used in result table output
+
+ // PRIVATE VARIABLES
+ var $dbc = NULL;
+ var $totals = array();
+ var $tests = array('base','GroupB', 'GroupC');
+ var $paramTypes = array('php', 'soapval');
+ var $endpoints = array();
+ var $html = 1;
+
+ function Interop_Client() {
+ global $interopConfig;
+ $this->DSN = $interopConfig['DSN'];
+ $this->baseURL = $interopConfig['baseURL'];
+ //$this->baseURL = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
+ // set up the database connection
+ $this->dbc = DB::connect($this->DSN, true);
+ // if it errors out, just ignore it and rely on regular methods
+ if (DB::isError($this->dbc)) {
+ echo $this->dbc->getMessage();
+ $this->dbc = NULL;
+ }
+ // set up local endpoint
+ $this->localEndpoint['base'] = (object)array(
+ 'endpointName'=>'PHP ext/soap',
+ 'endpointURL'=>$this->baseURL.'/server_round2_base.php',
+ 'wsdlURL'=>$this->baseURL.'/interop.wsdl.php'
+ );
+ $this->localEndpoint['GroupB'] = (object)array(
+ 'endpointName'=>'PHP ext/soap',
+ 'endpointURL'=>$this->baseURL.'/server_round2_groupB.php',
+ 'wsdlURL'=>$this->baseURL.'/interopB.wsdl.php'
+ );
+ $this->localEndpoint['GroupC'] = (object)array(
+ 'endpointName'=>'PHP ext/soap',
+ 'endpointURL'=>$this->baseURL.'/server_round2_groupC.php',
+ 'wsdlURL'=>$this->baseURL.'/echoheadersvc.wsdl.php');
+ }
+
+ function _fetchEndpoints(&$soapclient, $test) {
+ $this->_getEndpoints($test, 1);
+
+ // retreive endpoints from the endpoint server
+ $endpointArray = $soapclient->__soapCall("GetEndpointInfo",array("groupName"=>$test),array('soapaction'=>"http://soapinterop.org/",'uri'=>"http://soapinterop.org/"));
+ if (is_soap_fault($endpointArray) || PEAR::isError($endpointArray)) {
+ if ($this->html) print "<pre>";
+ print $soapclient->wire."\n";
+ print_r($endpointArray);
+ if ($this->html) print "</pre>";
+ print "\n";
+ return;
+ }
+
+ // add our local endpoint
+ if ($this->localEndpoint[$test]) {
+ array_push($endpointArray, $this->localEndpoint[$test]);
+ }
+
+ if (!$endpointArray) return;
+
+ // reset the status to zero
+ $res = $this->dbc->query("update endpoints set status = 0 where class='$test'");
+ if (DB::isError($res)) {
+ die ($res->getMessage());
+ }
+ if (is_object($res)) $res->free();
+ // save new endpoints into database
+ foreach($endpointArray as $k => $v){
+ if (array_key_exists($v->endpointName,$this->endpoints)) {
+ $res = $this->dbc->query("update endpoints set endpointURL='{$v->endpointURL}', wsdlURL='{$v->wsdlURL}', status=1 where id={$this->endpoints[$v->endpointName]['id']}");
+ } else {
+ $res = $this->dbc->query("insert into endpoints (endpointName,endpointURL,wsdlURL,class) values('{$v->endpointName}','{$v->endpointURL}','{$v->wsdlURL}','$test')");
+ }
+ if (DB::isError($res)) {
+ die ($res->getMessage());
+ }
+ if (is_object($res)) $res->free();
+ }
+ }
+
+ /**
+ * fetchEndpoints
+ * retreive endpoints interop server
+ *
+ * @return boolean result
+ * @access private
+ */
+ function fetchEndpoints($test = NULL) {
+ // fetch from the interop server
+ try {
+ $soapclient = new SoapClient($this->interopServer);
+ if ($test) {
+ $this->_fetchEndpoints($soapclient, $test);
+ } else {
+ foreach ($this->tests as $test) {
+ $this->_fetchEndpoints($soapclient, $test);
+ }
+ $test = 'base';
+ }
+ } catch (SoapFault $fault) {
+ if ($this->html) {
+ echo "<pre>$fault</pre>\n";
+ } else {
+ echo "$fault\n";
+ }
+ return NULL;
+ }
+ // retreive all endpoints now
+ $this->currentTest = $test;
+ $x = $this->_getEndpoints($test);
+ return $x;
+ }
+
+ /**
+ * getEndpoints
+ * retreive endpoints from either database or interop server
+ *
+ * @param string base (see local var $tests)
+ * @param boolean all (if false, only get valid endpoints, status=1)
+ * @return boolean result
+ * @access private
+ */
+ function getEndpoints($base = 'base', $all = 0) {
+ if (!$this->_getEndpoints($base, $all)) {
+ return $this->fetchEndpoints($base);
+ }
+ return TRUE;
+ }
+
+ /**
+ * _getEndpoints
+ * retreive endpoints from database
+ *
+ * @param string base (see local var $tests)
+ * @param boolean all (if false, only get valid endpoints, status=1)
+ * @return boolean result
+ * @access private
+ */
+ function _getEndpoints($base = "", $all = 0) {
+ $this->endpoints = array();
+
+ // build sql
+ $sql = "select * from endpoints ";
+ if ($base) {
+ $sql .= "where class='$base' ";
+ if (!$all) $sql .= "and status=1";
+ } else
+ if (!$all) $sql .= "where status=1";
+ $sql .= " order by endpointName";
+
+
+ $db_ep = $this->dbc->getAll($sql,NULL, DB_FETCHMODE_ASSOC );
+ if (DB::isError($db_ep)) {
+ echo $sql."\n";
+ echo $db_ep->getMessage();
+ return FALSE;
+ }
+ // rearange the array
+ foreach ($db_ep as $entry) {
+ $this->endpoints[$entry['endpointName']] = $entry;
+ }
+
+ if (count($this->endpoints) > 0) {
+ $this->currentTest = $base;
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ /**
+ * getResults
+ * retreive results from the database, stuff them into the endpoint array
+ *
+ * @access private
+ */
+ function getResults($test = 'base', $type = 'php', $wsdl = 0) {
+ // be sure we have the right endpoints for this test result
+ $this->getEndpoints($test);
+
+ // retreive the results and put them into the endpoint info
+ $sql = "select * from results where class='$test' and type='$type' and wsdl=$wsdl";
+ $results = $this->dbc->getAll($sql,NULL, DB_FETCHMODE_ASSOC );
+ foreach ($results as $result) {
+ // find the endpoint
+ foreach ($this->endpoints as $epn => $epi) {
+ if ($epi['id'] == $result['endpoint']) {
+ // store the info
+ $this->endpoints[$epn]['methods'][$result['function']] = $result;
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * saveResults
+ * save the results of a method test into the database
+ *
+ * @access private
+ */
+ function _saveResults($endpoint_id, &$soap_test) {
+ if ($this->nosave) return;
+
+ $result = $soap_test->result;
+ $wire = $result['wire'];
+ if ($result['success']) {
+ $success = 'OK';
+ $error = '';
+ } else {
+ $success = $result['fault']->faultcode;
+ $pos = strpos($success,':');
+ if ($pos !== false) {
+ $success = substr($success,$pos+1);
+ }
+ $error = $result['fault']->faultstring;
+ if (!$wire) $wire= $result['fault']->detail;
+ }
+
+ $test_name = $soap_test->test_name;
+
+ $sql = "delete from results where endpoint=$endpoint_id ".
+ "and class='$this->currentTest' and type='$this->paramType' ".
+ "and wsdl=$this->useWSDL and function=".
+ $this->dbc->quote($test_name);
+ #echo "\n".$sql;
+ $res = $this->dbc->query($sql);
+ if (DB::isError($res)) {
+ die ($res->getMessage());
+ }
+ if (is_object($res)) $res->free();
+
+ $sql = "insert into results (endpoint,stamp,class,type,wsdl,function,result,error,wire) ".
+ "values($endpoint_id,".time().",'$this->currentTest',".
+ "'$this->paramType',$this->useWSDL,".
+ $this->dbc->quote($test_name).",".
+ $this->dbc->quote($success).",".
+ $this->dbc->quote($error).",".
+ ($wire?$this->dbc->quote($wire):"''").")";
+ #echo "\n".$sql;
+ $res = $this->dbc->query($sql);
+
+ if (DB::isError($res)) {
+ die ($res->getMessage());
+ }
+ if (is_object($res)) $res->free();
+ }
+
+ /**
+ * decodeSoapval
+ * decodes a soap value to php type, used for test result comparisions
+ *
+ * @param SOAP_Value soapval
+ * @return mixed result
+ * @access public
+ */
+ function decodeSoapval($soapval)
+ {
+ if (gettype($soapval) == "object" &&
+ (strcasecmp(get_class($soapval),"SoapParam") == 0 ||
+ strcasecmp(get_class($soapval),"SoapVar") == 0)) {
+ if (strcasecmp(get_class($soapval),"SoapParam") == 0)
+ $val = $soapval->param_data->enc_value;
+ else
+ $val = $soapval->enc_value;
+ } else {
+ $val = $soapval;
+ }
+ if (is_array($val)) {
+ foreach($val as $k => $v) {
+ if (gettype($v) == "object" &&
+ (strcasecmp(get_class($soapval),"SoapParam") == 0 ||
+ strcasecmp(get_class($soapval),"SoapVar") == 0)) {
+ $val[$k] = $this->decodeSoapval($v);
+ }
+ }
+ }
+ return $val;
+ }
+
+ /**
+ * compareResult
+ * compare two php types for a match
+ *
+ * @param string expect
+ * @param string test_result
+ * @return boolean result
+ * @access public
+ */
+ function compareResult($expect, $result, $type = NULL)
+ {
+ return compare($expect, $result);
+ }
+
+
+ /**
+ * doEndpointMethod
+ * run a method on an endpoint and store it's results to the database
+ *
+ * @param array endpoint_info
+ * @param SOAP_Test test
+ * @return boolean result
+ * @access public
+ */
+ function doEndpointMethod(&$endpoint_info, &$soap_test) {
+ $ok = FALSE;
+
+ // prepare a holder for the test results
+ $soap_test->result['class'] = $this->currentTest;
+ $soap_test->result['type'] = $this->paramType;
+ $soap_test->result['wsdl'] = $this->useWSDL;
+
+ if ($this->useWSDL) {
+ if (array_key_exists('wsdlURL',$endpoint_info)) {
+ if (!array_key_exists('client',$endpoint_info)) {
+ try {
+ $endpoint_info['client'] = new SoapClient($endpoint_info['wsdlURL'], array("trace"=>1));
+ } catch (SoapFault $ex) {
+ $endpoint_info['client']->wsdl->fault = $ex;
+ }
+ }
+ $soap =& $endpoint_info['client'];
+
+ # XXX how do we determine a failure on retreiving/parsing wsdl?
+ if ($soap->wsdl->fault) {
+ $fault = $soap->wsdl->fault;
+ $soap_test->setResult(0,'WSDL',
+ $fault->faultstring."\n\n".$fault->detail,
+ $fault->faultstring,
+ $fault
+ );
+ return FALSE;
+ }
+ } else {
+ $fault = new SoapFault('WSDL',"no WSDL defined for $endpoint");
+ $soap_test->setResult(0,'WSDL',
+ $fault->faultstring,
+ $fault->faultstring,
+ $fault
+ );
+ return FALSE;
+ }
+ $namespace = false;
+ $soapaction = false;
+ } else {
+ $namespace = $soapaction = 'http://soapinterop.org/';
+ // hack to make tests work with MS SoapToolkit
+ // it's the only one that uses this soapaction, and breaks if
+ // it isn't right. Can't wait for soapaction to be fully depricated
+ if ($this->currentTest == 'base' &&
+ strstr($endpoint_info['endpointName'],'MS SOAP ToolKit 2.0')) {
+ $soapaction = 'urn:soapinterop';
+ }
+ if (!array_key_exists('client',$endpoint_info)) {
+ $endpoint_info['client'] = new SoapClient(null,array('location'=>$endpoint_info['endpointURL'],'uri'=>$soapaction,'trace'=>1));
+ }
+ $soap = $endpoint_info['client'];
+ }
+// // add headers to the test
+// if ($soap_test->headers) {
+// // $header is already a SOAP_Header class
+// foreach ($soap_test->headers as $header) {
+// $soap->addHeader($header);
+// }
+// }
+ // XXX no way to set encoding
+ // this lets us set UTF-8, US-ASCII or other
+ //$soap->setEncoding($soap_test->encoding);
+try {
+ if ($this->useWSDL && !$soap_test->headers && !$soap_test->headers_expect) {
+ $args = '';
+ foreach ($soap_test->method_params as $pname => $param) {
+ $arg = '$soap_test->method_params["'.$pname.'"]';
+ $args .= $args?','.$arg:$arg;
+ }
+ $return = eval('return $soap->'.$soap_test->method_name.'('.$args.');');
+ } else {
+ if ($soap_test->headers || $soap_test->headers_expect) {
+ $return = $soap->__soapCall($soap_test->method_name,$soap_test->method_params,array('soapaction'=>$soapaction,'uri'=>$namespace), $soap_test->headers, $result_headers);
+ } else {
+ $return = $soap->__soapCall($soap_test->method_name,$soap_test->method_params,array('soapaction'=>$soapaction,'uri'=>$namespace));
+ }
+ }
+} catch (SoapFault $ex) {
+ $return = $ex;
+}
+
+ if(!is_soap_fault($return)){
+ if ($soap_test->expect !== NULL) {
+ $sent = $soap_test->expect;
+ } else if (is_array($soap_test->method_params) && count($soap_test->method_params) == 1) {
+ reset($soap_test->method_params);
+ $sent = current($soap_test->method_params);
+ } else if (is_array($soap_test->method_params) && count($soap_test->method_params) == 0) {
+ $sent = null;
+ } else {
+ $sent = $soap_test->method_params;
+ }
+
+ // compare header results
+ $headers_ok = TRUE;
+ if ($soap_test->headers || $soap_test->headers_expect) {
+ $headers_ok = $this->compareResult($soap_test->headers_expect, $result_headers);
+ }
+
+ # we need to decode what we sent so we can compare!
+ $sent_d = $this->decodeSoapval($sent);
+
+ $soap_test->result['sent'] = $sent;
+ $soap_test->result['return'] = $return;
+
+ // compare the results with what we sent
+
+ if ($soap_test->cmp_func !== NULL) {
+ $cmp_func = $soap_test->cmp_func;
+ $ok = $cmp_func($sent_d,$return);
+ } else {
+ $ok = $this->compareResult($sent_d,$return, $sent->type);
+ if (!$ok && $soap_test->expect) {
+ $ok = $this->compareResult($soap_test->expect,$return);
+ }
+ }
+
+ // save the wire
+ $wire = "REQUEST:\n".str_replace('" ',"\" \n",str_replace('>',">\n",$soap->__getlastrequest()))."\n\n".
+ "RESPONSE:\n".str_replace('" ',"\" \n",str_replace('>',">\n",$soap->__getlastresponse()))."\n\n".
+ "EXPECTED:\n".var_dump_str($sent_d)."\n".
+ "RESULTL:\n".var_dump_str($return);
+ if ($soap_test->headers_expect) {
+ $wire .= "\nEXPECTED HEADERS:\n".var_dump_str($soap_test->headers_expect)."\n".
+ "RESULT HEADERS:\n".var_dump_str($result_headers);
+ }
+ #print "Wire:".htmlentities($wire);
+
+ if($ok){
+ if (!$headers_ok) {
+ $fault = new SoapFault('HEADER','The returned result did not match what we expected to receive');
+ $soap_test->setResult(0,$fault->faultcode,
+ $wire,
+ $fault->faultstring,
+ $fault
+ );
+ } else {
+ $soap_test->setResult(1,'OK',$wire);
+ $success = TRUE;
+ }
+ } else {
+ $fault = new SoapFault('RESULT','The returned result did not match what we expected to receive');
+ $soap_test->setResult(0,$fault->faultcode,
+ $wire,
+ $fault->faultstring,
+ $fault
+ );
+ }
+ } else {
+ $fault = $return;
+ if ($soap_test->expect_fault) {
+ $ok = 1;
+ $res = 'OK';
+ } else {
+ $ok = 0;
+ $res =$fault->faultcode;
+ $pos = strpos($res,':');
+ if ($pos !== false) {
+ $res = substr($res,$pos+1);
+ }
+ }
+ // save the wire
+ $wire = "REQUEST:\n".str_replace('" ',"\" \n",str_replace('>',">\n",$soap->__getlastrequest()))."\n\n".
+ "RESPONSE:\n".str_replace('" ',"\" \n",str_replace('>',">\n",$soap->__getlastresponse()))."\n".
+ "RESULTL:\n".var_dump_str($return);
+ #print "Wire:".htmlentities($wire);
+
+ $soap_test->setResult($ok,$res, $wire,$fault->faultstring, $fault);
+
+ }
+ return $ok;
+ }
+
+
+ /**
+ * doTest
+ * run a single round of tests
+ *
+ * @access public
+ */
+ function doTest() {
+ global $soap_tests;
+ // get endpoints for this test
+ $this->getEndpoints($this->currentTest);
+ #clear totals
+ $this->totals = array();
+
+ $i = 0;
+ foreach($this->endpoints as $endpoint => $endpoint_info){
+
+ // if we specify an endpoint, skip until we find it
+ if ($this->specificEndpoint && $endpoint != $this->specificEndpoint) continue;
+ if ($this->useWSDL && !$endpoint_info['endpointURL']) continue;
+
+ $skipendpoint = FALSE;
+ $this->totals['servers']++;
+ #$endpoint_info['tests'] = array();
+
+ if ($this->show) {
+ print "Processing $endpoint at {$endpoint_info['endpointURL']}";
+ if ($this->html) print "<br>\n"; else print "\n";
+ }
+
+ foreach($soap_tests[$this->currentTest] as $soap_test) {
+ //foreach(array_keys($method_params[$this->currentTest][$this->paramType]) as $method)
+
+ // only run the type of test we're looking for (php or soapval)
+ if ($soap_test->type != $this->paramType) continue;
+
+ // if we haven't reached our startpoint, skip
+ if ($this->startAt && $this->startAt != $endpoint_info['endpointName']) continue;
+ $this->startAt = '';
+
+ // if this is in our skip list, skip it
+ if (in_array($endpoint, $this->skipEndpointList)) {
+ $skipendpoint = TRUE;
+ $skipfault = new SoapFault('SKIP','endpoint skipped');
+ $soap_test->setResult(0,$fault->faultcode, '',
+ $skipfault->faultstring,
+ $skipfault
+ );
+ #$endpoint_info['tests'][] = &$soap_test;
+ #$soap_test->showTestResult($this->debug, $this->html);
+ #$this->_saveResults($endpoint_info['id'], $soap_test->method_name);
+ $soap_test->result = NULL;
+ continue;
+ }
+
+ // if we're looking for a specific method, skip unless we have it
+ if ($this->testMethod && strcmp($this->testMethod,$soap_test->test_name) != 0) continue;
+
+ // if we are skipping the rest of the tests (due to error) note a fault
+ if ($skipendpoint) {
+ $soap_test->setResult(0,$fault->faultcode, '',
+ $skipfault->faultstring,
+ $skipfault
+ );
+ #$endpoint_info['tests'][] = &$soap_test;
+ $this->totals['fail']++;
+ } else {
+ // run the endpoint test
+ if ($this->doEndpointMethod($endpoint_info, $soap_test)) {
+ $this->totals['success']++;
+ } else {
+ $skipendpoint = $soap_test->result['fault']->faultcode=='HTTP'
+ && strstr($soap_test->result['fault']->faultstring,'Connect Error');
+ $skipfault = $soap_test->result['fault'];
+ $this->totals['fail']++;
+ }
+ #$endpoint_info['tests'][] = &$soap_test;
+ }
+ $soap_test->showTestResult($this->debug, $this->html);
+ $this->_saveResults($endpoint_info['id'], $soap_test);
+ $soap_test->result = NULL;
+ $this->totals['calls']++;
+ }
+ if ($this->numservers && ++$i >= $this->numservers) break;
+ }
+ }
+
+ function doGroupTests() {
+ $dowsdl = array(0,1);
+ foreach($dowsdl as $usewsdl) {
+ $this->useWSDL = $usewsdl;
+ foreach($this->paramTypes as $ptype) {
+ // skip a pointless test
+ if ($usewsdl && $ptype == 'soapval') break;
+ $this->paramType = $ptype;
+ $this->doTest();
+ }
+ }
+ }
+
+ /**
+ * doTests
+ * go all out. This takes time.
+ *
+ * @access public
+ */
+ function doTests() {
+ // the mother of all interop tests
+ $dowsdl = array(0,1);
+ foreach($this->tests as $test) {
+ $this->currentTest = $test;
+ foreach($dowsdl as $usewsdl) {
+ $this->useWSDL = $usewsdl;
+ foreach($this->paramTypes as $ptype) {
+ // skip a pointless test
+ if ($usewsdl && $ptype == 'soapval') break;
+ $this->paramType = $ptype;
+ $this->doTest();
+ }
+ }
+ }
+ }
+
+ // ***********************************************************
+ // output functions
+
+ /**
+ * getResults
+ * retreive results from the database, stuff them into the endpoint array
+ *
+ * @access private
+ */
+ function getMethodList($test = 'base') {
+ // retreive the results and put them into the endpoint info
+ $sql = "select distinct(function) from results where class='$test' order by function";
+ $results = $this->dbc->getAll($sql);
+ $ar = array();
+ foreach($results as $result) {
+ $ar[] = $result[0];
+ }
+ return $ar;
+ }
+
+ function outputTable()
+ {
+ $methods = $this->getMethodList($this->currentTest);
+ if (!$methods) return;
+ $this->getResults($this->currentTest,$this->paramType,$this->useWSDL);
+
+ echo "<b>Testing $this->currentTest ";
+ if ($this->useWSDL) echo "using WSDL ";
+ else echo "using Direct calls ";
+ echo "with $this->paramType values</b><br>\n";
+
+ // calculate totals for this table
+ $this->totals['success'] = 0;
+ $this->totals['fail'] = 0;
+ $this->totals['servers'] = 0; #count($this->endpoints);
+ foreach ($this->endpoints as $endpoint => $endpoint_info) {
+ if (count($endpoint_info['methods']) > 0) {
+ $this->totals['servers']++;
+ foreach ($methods as $method) {
+ $r = $endpoint_info['methods'][$method]['result'];
+ if ($r == 'OK') $this->totals['success']++;
+ else $this->totals['fail']++;
+ }
+ } else {
+ unset($this->endpoints[$endpoint]);
+ }
+ }
+ $this->totals['calls'] = count($methods) * $this->totals['servers'];
+
+ echo "\n\n<b>Servers: {$this->totals['servers']} Calls: {$this->totals['calls']} Success: {$this->totals['success']} Fail: {$this->totals['fail']}</b><br>\n";
+
+ echo "<table border=\"1\" cellspacing=\"0\" cellpadding=\"2\">\n";
+ echo "<tr><td class=\"BLANK\">Endpoint</td>\n";
+ foreach ($methods as $method) {
+ $info = split(':', $method);
+ echo "<td class='BLANK' valign='top'>";
+ foreach ($info as $m) {
+ $hi = split(',',$m);
+ echo '<b>'.$hi[0]."</b><br>\n";
+ if (count($hi) > 1) {
+ echo "&nbsp;&nbsp;Actor=".($hi[1]?'Target':'Not Target')."<br>\n";
+ echo "&nbsp;&nbsp;MustUnderstand=$hi[2]<br>\n";
+ }
+ }
+ echo "</td>\n";
+ }
+ echo "</tr>\n";
+ $faults = array();
+ $fi = 0;
+ foreach ($this->endpoints as $endpoint => $endpoint_info) {
+ if (array_key_exists('wsdlURL',$endpoint_info)) {
+ echo "<tr><td class=\"BLANK\"><a href=\"{$endpoint_info['wsdlURL']}\">$endpoint</a></td>\n";
+ } else {
+ echo "<tr><td class=\"BLANK\">$endpoint</td>\n";
+ }
+ foreach ($methods as $method) {
+ $id = $endpoint_info['methods'][$method]['id'];
+ $r = $endpoint_info['methods'][$method]['result'];
+ $e = $endpoint_info['methods'][$method]['error'];
+ if ($e) {
+ $faults[$fi++] = $e;
+ }
+ if ($r) {
+ echo "<td class='$r'><a href='$PHP_SELF?wire=$id'>$r</a></td>\n";
+ } else {
+ echo "<td class='untested'>untested</td>\n";
+ }
+ }
+ echo "</tr>\n";
+ }
+ echo "</table><br>\n";
+ if ($this->showFaults && count($faults) > 0) {
+ echo "<b>ERROR Details:</b><br>\n<ul>\n";
+ # output more error detail
+ foreach ($faults as $fault) {
+ echo '<li>'.HTMLSpecialChars($fault)."</li>\n";
+ }
+ }
+ echo "</ul><br><br>\n";
+ }
+
+ function outputTables() {
+ // the mother of all interop tests
+ $dowsdl = array(0,1);
+ foreach($this->tests as $test) {
+ $this->currentTest = $test;
+ foreach($dowsdl as $usewsdl) {
+ $this->useWSDL = $usewsdl;
+ foreach($this->paramTypes as $ptype) {
+ // skip a pointless test
+ if ($usewsdl && $ptype == 'soapval') break;
+ $this->paramType = $ptype;
+ $this->outputTable();
+ }
+ }
+ }
+ }
+
+ function showWire($id) {
+ $results = $this->dbc->getAll("select * from results where id=$id",NULL, DB_FETCHMODE_ASSOC );
+ #$wire = preg_replace("/>/",">\n",$results[0]['wire']);
+ $wire = $results[0]['wire'];
+ if ($this->html) print "<pre>";
+ echo "\n".HTMLSpecialChars($wire);
+ if ($this->html) print "</pre>";
+ print "\n";
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/ext/soap/interop/client_round2_params.php b/ext/soap/interop/client_round2_params.php
new file mode 100644
index 0000000..f0987a1
--- /dev/null
+++ b/ext/soap/interop/client_round2_params.php
@@ -0,0 +1,622 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+define('SOAP_TEST_ACTOR_OTHER','http://some/other/actor');
+
+class SOAP_Test {
+ var $type = 'php';
+ var $test_name = NULL;
+ var $method_name = NULL;
+ var $method_params = NULL;
+ var $cmp_func = NULL;
+ var $expect = NULL;
+ var $expect_fault = FALSE;
+ var $headers = NULL;
+ var $headers_expect = NULL;
+ var $result = array();
+ var $show = 1;
+ var $debug = 0;
+ var $encoding = 'UTF-8';
+
+ function SOAP_Test($methodname, $params, $expect = NULL, $cmp_func = NULL) {
+ # XXX we have to do this to make php-soap happy with NULL params
+ if (!$params) $params = array();
+
+ if (strchr($methodname,'(')) {
+ preg_match('/(.*)\((.*)\)/',$methodname,$matches);
+ $this->test_name = $methodname;
+ $this->method_name = $matches[1];
+ } else {
+ $this->test_name = $this->method_name = $methodname;
+ }
+ $this->method_params = $params;
+ if ($expect !== NULL) {
+ $this->expect = $expect;
+ }
+ if ($cmp_func !== NULL) {
+ $this->cmp_func = $cmp_func;
+ }
+
+ // determine test type
+ if ($params) {
+ $v = array_values($params);
+ if (gettype($v[0]) == 'object' &&
+ (get_class($v[0]) == 'SoapVar' || get_class($v[0]) == 'SoapParam'))
+ $this->type = 'soapval';
+ }
+ }
+
+ function setResult($ok, $result, $wire, $error = '', $fault = NULL)
+ {
+ $this->result['success'] = $ok;
+ $this->result['result'] = $result;
+ $this->result['error'] = $error;
+ $this->result['wire'] = $wire;
+ $this->result['fault'] = $fault;
+ }
+
+ /**
+ * showMethodResult
+ * print simple output about a methods result
+ *
+ * @param array endpoint_info
+ * @param string method
+ * @access public
+ */
+ function showTestResult($debug = 0, $html = 0) {
+ // debug output
+ if ($debug) $this->show = 1;
+ if ($debug) {
+ echo str_repeat("-",50).$html?"<br>\n":"\n";
+ }
+
+ echo "testing $this->test_name : ";
+
+ if ($debug) {
+ print "method params: ";
+ print_r($this->params);
+ print "\n";
+ }
+
+ $ok = $this->result['success'];
+ if ($ok) {
+ if ($html) {
+ print "<font color=\"#00cc00\">SUCCESS</font>\n";
+ } else {
+ print "SUCCESS\n";
+ }
+ } else {
+ $fault = $this->result['fault'];
+ if ($fault) {
+ $res = $fault->faultcode;
+ $pos = strpos($res,':');
+ if ($pos !== false) {
+ $res = substr($res,$pos+1);
+ }
+ if ($html) {
+ print "<font color=\"#ff0000\">FAILED: [$res] {$fault->faultstring}</font>\n";
+ } else {
+ print "FAILED: [$res] {$fault->faultstring}\n";
+ }
+ } else {
+ if ($html) {
+ print "<font color=\"#ff0000\">FAILED: ".$this->result['result']."</font>\n";
+ } else {
+ print "FAILED: ".$this->result['result']."\n";
+ }
+ }
+ }
+ if ($debug) {
+ if ($html) {
+ echo "<pre>\n".htmlentities($this->result['wire'])."</pre>\n";
+ } else {
+ echo "\n".htmlentities($this->result['wire'])."\n";
+ }
+ }
+ }
+}
+
+# XXX I know this isn't quite right, need to deal with this better
+function make_2d($x, $y)
+{
+ for ($_x = 0; $_x < $x; $_x++) {
+ for ($_y = 0; $_y < $y; $_y++) {
+ $a[$_x][$_y] = "x{$_x}y{$_y}";
+ }
+ }
+ return $a;
+}
+
+function soap_value($name, $value, $type, $type_name=NULL, $type_ns=NULL) {
+ return new SoapParam(new SoapVar($value,$type,$type_name,$type_ns),$name);
+}
+
+class SOAPStruct {
+ var $varString;
+ var $varInt;
+ var $varFloat;
+ function SOAPStruct($s, $i, $f) {
+ $this->varString = $s;
+ $this->varInt = $i;
+ $this->varFloat = $f;
+ }
+}
+
+//***********************************************************
+// Base echoString
+
+$soap_tests['base'][] = new SOAP_Test('echoString', array('inputString' => 'hello world!'));
+$soap_tests['base'][] = new SOAP_Test('echoString', array('inputString' => soap_value('inputString','hello world',XSD_STRING)));
+$soap_tests['base'][] = new SOAP_Test('echoString(empty)', array('inputString' => ''));
+$soap_tests['base'][] = new SOAP_Test('echoString(empty)', array('inputString' => soap_value('inputString','',XSD_STRING)));
+$soap_tests['base'][] = new SOAP_Test('echoString(null)', array('inputString' => NULL));
+$soap_tests['base'][] = new SOAP_Test('echoString(null)', array('inputString' => soap_value('inputString',NULL,XSD_STRING)));
+//$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => ">,<,&,\",',0:\x00",1:\x01,2:\x02,3:\x03,4:\x04,5:\x05,6:\x06,7:\x07,8:\x08,9:\x09,10:\x0a,11:\x0b,12:\x0c,13:\x0d,14:\x0e,15:\x0f,16:\x10,17:\x11,18:\x12,19:\x13,20:\x14,21:\x15,22:\x16,23:\x17,24:\x18,25:\x19,26:\x1a,27:\x1b,28:\x1c,29:\x1d,30:\x1e,31:\x1f"));
+//$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => soap_value('inputString',">,<,&,\",',0:\x00",1:\x01,2:\x02,3:\x03,4:\x04,5:\x05,6:\x06,7:\x07,8:\x08,9:\x09,10:\x0a,11:\x0b,12:\x0c,13:\x0d,14:\x0e,15:\x0f,16:\x10,17:\x11,18:\x12,19:\x13,20:\x14,21:\x15,22:\x16,23:\x17,24:\x18,25:\x19,26:\x1a,27:\x1b,28:\x1c,29:\x1d,30:\x1e,31:\x1f",XSD_STRING)));
+$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => ">,<,&,\",',\\,\n"));
+$soap_tests['base'][] = new SOAP_Test('echoString(entities)', array('inputString' => soap_value('inputString',">,<,&,\",',\\,\n",XSD_STRING)));
+$test = new SOAP_Test('echoString(utf-8)', array('inputString' => utf8_encode('ỗÈéóÒ₧⅜ỗỸ')));
+$test->encoding = 'UTF-8';
+$soap_tests['base'][] = $test;
+$test = new SOAP_Test('echoString(utf-8)', array('inputString' => soap_value('inputString',utf8_encode('ỗÈéóÒ₧⅜ỗỸ'),XSD_STRING)));
+$test->encoding = 'UTF-8';
+$soap_tests['base'][] = $test;
+
+//***********************************************************
+// Base echoStringArray
+
+$soap_tests['base'][] = new SOAP_Test('echoStringArray',
+ array('inputStringArray' => array('good','bad')));
+$soap_tests['base'][] = new SOAP_Test('echoStringArray',
+ array('inputStringArray' =>
+ soap_value('inputStringArray',array('good','bad'),SOAP_ENC_ARRAY,"ArrayOfstring","http://soapinterop.org/xsd")));
+
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(one)',
+ array('inputStringArray' => array('good')));
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(one)',
+ array('inputStringArray' =>
+ soap_value('inputStringArray',array('good'),SOAP_ENC_ARRAY,"ArrayOfstring","http://soapinterop.org/xsd")));
+
+// empty array test
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(empty)', array('inputStringArray' => array()));
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(empty)', array('inputStringArray' => soap_value('inputStringArray',array(),SOAP_ENC_ARRAY,"ArrayOfstring","http://soapinterop.org/xsd")));
+
+# XXX NULL Arrays not supported
+// null array test
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(null)', array('inputStringArray' => NULL));
+$soap_tests['base'][] = new SOAP_Test('echoStringArray(null)', array('inputStringArray' => soap_value('inputStringArray',NULL,SOAP_ENC_ARRAY,"ArrayOfstring","http://soapinterop.org/xsd")));
+
+//***********************************************************
+// Base echoInteger
+$x = new SOAP_Test('echoInteger', array('inputInteger' => 34345));
+$soap_tests['base'][] = new SOAP_Test('echoInteger', array('inputInteger' => 34345));
+$soap_tests['base'][] = new SOAP_Test('echoInteger', array('inputInteger' => soap_value('inputInteger',12345,XSD_INT)));
+
+//***********************************************************
+// Base echoIntegerArray
+
+$soap_tests['base'][] = new SOAP_Test('echoIntegerArray', array('inputIntegerArray' => array(1,234324324,2)));
+$soap_tests['base'][] = new SOAP_Test('echoIntegerArray',
+ array('inputIntegerArray' =>
+ soap_value('inputIntegerArray',
+ array(new SoapVar(12345,XSD_INT),new SoapVar(654321,XSD_INT)),
+ SOAP_ENC_ARRAY,"ArrayOfint","http://soapinterop.org/xsd")));
+
+//***********************************************************
+// Base echoFloat
+
+$soap_tests['base'][] = new SOAP_Test('echoFloat', array('inputFloat' => 342.23));
+$soap_tests['base'][] = new SOAP_Test('echoFloat', array('inputFloat' => soap_value('inputFloat',123.45,XSD_FLOAT)));
+
+//***********************************************************
+// Base echoFloatArray
+
+$soap_tests['base'][] = new SOAP_Test('echoFloatArray', array('inputFloatArray' => array(1.3223,34.2,325.325)));
+$soap_tests['base'][] = new SOAP_Test('echoFloatArray',
+ array('inputFloatArray' =>
+ soap_value('inputFloatArray',
+ array(new SoapVar(123.45,XSD_FLOAT),new SoapVar(654.321,XSD_FLOAT)),
+ SOAP_ENC_ARRAY,"ArrayOffloat","http://soapinterop.org/xsd")));
+//***********************************************************
+// Base echoStruct
+
+$soapstruct = new SOAPStruct('arg',34,325.325);
+# XXX no way to set a namespace!!!
+$soapsoapstruct = soap_value('inputStruct',$soapstruct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd");
+$soap_tests['base'][] = new SOAP_Test('echoStruct', array('inputStruct' =>$soapstruct));
+$soap_tests['base'][] = new SOAP_Test('echoStruct', array('inputStruct' =>$soapsoapstruct));
+
+//***********************************************************
+// Base echoStructArray
+
+$soap_tests['base'][] = new SOAP_Test('echoStructArray', array('inputStructArray' => array(
+ $soapstruct,$soapstruct,$soapstruct)));
+$soap_tests['base'][] = new SOAP_Test('echoStructArray', array('inputStructArray' =>
+ soap_value('inputStructArray',array(
+ new SoapVar($soapstruct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ new SoapVar($soapstruct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ new SoapVar($soapstruct,SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd")),
+ SOAP_ENC_ARRAY,"ArrayOfSOAPStruct","http://soapinterop.org/xsd")));
+
+
+//***********************************************************
+// Base echoVoid
+
+$soap_tests['base'][] = new SOAP_Test('echoVoid', NULL);
+$test = new SOAP_Test('echoVoid', NULL);
+$test->type = 'soapval';
+$soap_tests['base'][] = $test;
+
+//***********************************************************
+// Base echoBase64
+
+$soap_tests['base'][] = new SOAP_Test('echoBase64', array('inputBase64' => 'TmVicmFza2E='));
+$soap_tests['base'][] = new SOAP_Test('echoBase64', array('inputBase64' =>
+ soap_value('inputBase64','TmVicmFza2E=',XSD_BASE64BINARY)));
+
+//***********************************************************
+// Base echoHexBinary
+
+$soap_tests['base'][] = new SOAP_Test('echoHexBinary', array('inputHexBinary' => '736F61707834'),'736F61707834','hex_compare');
+$soap_tests['base'][] = new SOAP_Test('echoHexBinary', array('inputHexBinary' =>
+ soap_value('inputHexBinary','736F61707834',XSD_HEXBINARY)),'736F61707834','hex_compare');
+
+//***********************************************************
+// Base echoDecimal
+
+# XXX test fails because php-soap incorrectly sets decimal to long rather than float
+$soap_tests['base'][] = new SOAP_Test('echoDecimal', array('inputDecimal' => '12345.67890'));
+$soap_tests['base'][] = new SOAP_Test('echoDecimal', array('inputDecimal' =>
+ soap_value('inputDecimal','12345.67890',XSD_DECIMAL)));
+
+//***********************************************************
+// Base echoDate
+
+# php-soap doesn't handle datetime types properly yet
+$soap_tests['base'][] = new SOAP_Test('echoDate', array('inputDate' => '2001-05-24T17:31:41Z'), null, 'date_compare');
+$soap_tests['base'][] = new SOAP_Test('echoDate', array('inputDate' =>
+ soap_value('inputDate','2001-05-24T17:31:41Z',XSD_DATETIME)), null, 'date_compare');
+
+//***********************************************************
+// Base echoBoolean
+
+# php-soap sends boolean as zero or one, which is ok, but to be explicit, send true or false.
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(true)', array('inputBoolean' => TRUE));
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(true)', array('inputBoolean' =>
+ soap_value('inputBoolean',TRUE,XSD_BOOLEAN)));
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(false)', array('inputBoolean' => FALSE));
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(false)', array('inputBoolean' =>
+ soap_value('inputBoolean',FALSE,XSD_BOOLEAN)));
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(1)', array('inputBoolean' => 1),true);
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(1)', array('inputBoolean' =>
+ soap_value('inputBoolean',1,XSD_BOOLEAN)),true);
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(0)', array('inputBoolean' => 0),false);
+$soap_tests['base'][] = new SOAP_Test('echoBoolean(0)', array('inputBoolean' =>
+ soap_value('inputBoolean',0,XSD_BOOLEAN)),false);
+
+
+
+//***********************************************************
+// GROUP B
+
+
+//***********************************************************
+// GroupB echoStructAsSimpleTypes
+
+$expect = array(
+ 'outputString'=>'arg',
+ 'outputInteger'=>34,
+ 'outputFloat'=>325.325
+ );
+$soap_tests['GroupB'][] = new SOAP_Test('echoStructAsSimpleTypes',
+ array('inputStruct' => (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325
+ )), $expect);
+$soap_tests['GroupB'][] = new SOAP_Test('echoStructAsSimpleTypes',
+ array('inputStruct' =>
+ soap_value('inputStruct',
+ (object)array('varString' => 'arg',
+ 'varInt' => 34,
+ 'varFloat' => 325.325
+ ), SOAP_ENC_OBJECT, "SOAPStruct","http://soapinterop.org/xsd")), $expect);
+
+//***********************************************************
+// GroupB echoSimpleTypesAsStruct
+
+$expect =
+ (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325
+ );
+$soap_tests['GroupB'][] = new SOAP_Test('echoSimpleTypesAsStruct',
+ array(
+ 'inputString'=>'arg',
+ 'inputInteger'=>34,
+ 'inputFloat'=>325.325
+ ), $expect);
+$soap_tests['GroupB'][] = new SOAP_Test('echoSimpleTypesAsStruct',
+ array(
+ soap_value('inputString','arg', XSD_STRING),
+ soap_value('inputInteger',34, XSD_INT),
+ soap_value('inputFloat',325.325, XSD_FLOAT)
+ ), $expect);
+
+//***********************************************************
+// GroupB echo2DStringArray
+
+$soap_tests['GroupB'][] = new SOAP_Test('echo2DStringArray',
+ array('input2DStringArray' => make_2d(3,3)));
+
+$multidimarray =
+ soap_value('input2DStringArray',
+ array(
+ array('row0col0', 'row0col1', 'row0col2'),
+ array('row1col0', 'row1col1', 'row1col2')
+ ), SOAP_ENC_ARRAY
+ );
+//$multidimarray->options['flatten'] = TRUE;
+$soap_tests['GroupB'][] = new SOAP_Test('echo2DStringArray',
+ array('input2DStringArray' => $multidimarray));
+
+//***********************************************************
+// GroupB echoNestedStruct
+
+$strstr = (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325,
+ 'varStruct' => (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325
+ ));
+$soap_tests['GroupB'][] = new SOAP_Test('echoNestedStruct',
+ array('inputStruct' => $strstr));
+$soap_tests['GroupB'][] = new SOAP_Test('echoNestedStruct',
+ array('inputStruct' =>
+ soap_value('inputStruct',
+ (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325,
+ 'varStruct' => new SoapVar((object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325
+ ), SOAP_ENC_OBJECT, "SOAPStruct","http://soapinterop.org/xsd")
+ ), SOAP_ENC_OBJECT, "SOAPStructStruct","http://soapinterop.org/xsd"
+ )),$strstr);
+
+//***********************************************************
+// GroupB echoNestedArray
+
+$arrstr = (object)array(
+ 'varString'=>'arg',
+ 'varInt'=>34,
+ 'varFloat'=>325.325,
+ 'varArray' => array('red','blue','green')
+ );
+$soap_tests['GroupB'][] = new SOAP_Test('echoNestedArray',
+ array('inputStruct' => $arrstr));
+$soap_tests['GroupB'][] = new SOAP_Test('echoNestedArray',
+ array('inputStruct' =>
+ soap_value('inputStruct',
+ (object)array('varString' => 'arg',
+ 'varInt' => 34,
+ 'varFloat' => 325.325,
+ 'varArray' =>
+ new SoapVar(array("red", "blue", "green"), SOAP_ENC_ARRAY, "ArrayOfstring","http://soapinterop.org/xsd")
+ ), SOAP_ENC_OBJECT, "SOAPArrayStruct","http://soapinterop.org/xsd"
+ )),$arrstr);
+
+
+//***********************************************************
+// GROUP C header tests
+
+//***********************************************************
+// echoMeStringRequest
+
+// echoMeStringRequest with endpoint as header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=0 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', 'hello world', 0, SOAP_ACTOR_NEXT);
+$test->headers_expect = array('echoMeStringResponse'=>'hello world');
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=0 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', new SoapVar('hello world',XSD_STRING), 0, SOAP_ACTOR_NEXT);
+$test->headers_expect = array('echoMeStringResponse'=>'hello world');
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStringRequest with endpoint as header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=1 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', 'hello world', 1, SOAP_ACTOR_NEXT);
+$test->headers_expect = array('echoMeStringResponse'=>'hello world');
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=1 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', new SoapVar('hello world',XSD_STRING), 1, SOAP_ACTOR_NEXT);
+$test->headers_expect = array('echoMeStringResponse'=>'hello world');
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStringRequest with endpoint NOT header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=0 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', 'hello world', 0, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=0 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', new SoapVar('hello world',XSD_STRING), 0, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStringRequest with endpoint NOT header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=1 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', 'hello world', 1, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStringRequest mustUnderstand=1 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStringRequest', new SoapVar('hello world', XSD_STRING), 1, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStringRequest with endpoint header destination, must understand,
+// invalid namespace, should recieve a fault
+$test = new SOAP_Test('echoVoid(echoMeStringRequest invalid namespace)', NULL);
+$test->headers[] = new SoapHeader('http://unknown.org/echoheader/','echoMeStringRequest', 'hello world', 1, SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$test->expect_fault = TRUE;
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStringRequest invalid namespace)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://unknown.org/echoheader/','echoMeStringRequest', new SoapVar('hello world', XSD_STRING), 1, SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$test->expect_fault = TRUE;
+$soap_tests['GroupC'][] = $test;
+
+//***********************************************************
+// echoMeStructRequest
+
+// echoMeStructRequest with endpoint as header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=0 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SOAPStruct('arg',34,325.325), 0, SOAP_ACTOR_NEXT);
+$test->headers_expect =
+ array('echoMeStructResponse'=> (object)array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325));
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=0 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SoapVar(new SOAPStruct('arg',34,325.325),SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ 0, SOAP_ACTOR_NEXT);
+$test->headers_expect =
+ array('echoMeStructResponse'=> (object)array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325));
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStructRequest with endpoint as header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=1 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SOAPStruct('arg',34,325.325), 1, SOAP_ACTOR_NEXT);
+$test->headers_expect =
+ array('echoMeStructResponse'=> (object)array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325));
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=1 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SoapVar(new SOAPStruct('arg',34,325.325),SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ 1, SOAP_ACTOR_NEXT);
+$test->headers_expect =
+ array('echoMeStructResponse'=> (object)array('varString'=>'arg','varInt'=>34,'varFloat'=>325.325));
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStructRequest with endpoint NOT header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=0 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SOAPStruct('arg',34,325.325), 0, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=0 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SoapVar(new SOAPStruct('arg',34,325.325),SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ 0, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+// echoMeStructRequest with endpoint NOT header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=1 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SOAPStruct('arg',34,325.325), 1, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeStructRequest mustUnderstand=1 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeStructRequest',
+ new SoapVar(new SOAPStruct('arg',34,325.325),SOAP_ENC_OBJECT,"SOAPStruct","http://soapinterop.org/xsd"),
+ 1, SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+//***********************************************************
+// echoMeUnknown
+
+// echoMeUnknown with endpoint as header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=0 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', 'nobody understands me!',0,SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=0 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', new SoapVar('nobody understands me!',XSD_STRING),0,SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+// echoMeUnknown with endpoint as header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=1 actor=next)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', 'nobody understands me!',1,SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$test->expect_fault = TRUE;
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=1 actor=next)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', new SoapVar('nobody understands me!',XSD_STRING),1,SOAP_ACTOR_NEXT);
+$test->headers_expect = array();
+$test->expect_fault = TRUE;
+$soap_tests['GroupC'][] = $test;
+
+// echoMeUnknown with endpoint NOT header destination, doesn't have to understand
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=0 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', 'nobody understands me!',0,SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=0 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', new SoapVar('nobody understands me!',XSD_STRING),0,SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+// echoMeUnknown with endpoint NOT header destination, must understand
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=1 actor=other)', NULL);
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', 'nobody understands me!',1,SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+
+$test = new SOAP_Test('echoVoid(echoMeUnknown mustUnderstand=1 actor=other)', NULL);
+$test->type = 'soapval';
+$test->headers[] = new SoapHeader('http://soapinterop.org/echoheader/','echoMeUnknown', new SoapVar('nobody understands me!',XSD_STRING),1,SOAP_TEST_ACTOR_OTHER);
+$test->headers_expect = array();
+$soap_tests['GroupC'][] = $test;
+?>
diff --git a/ext/soap/interop/client_round2_results.php b/ext/soap/interop/client_round2_results.php
new file mode 100644
index 0000000..5be7199
--- /dev/null
+++ b/ext/soap/interop/client_round2_results.php
@@ -0,0 +1,75 @@
+<?php
+// NOTE: do not run this directly under a web server, as it will take a very long
+// time to execute. Run from a command line or something, and redirect output
+// to an html file.
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+require_once 'client_round2_interop.php';
+?>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+<style>
+TD { background-color: Red; }
+TD.BLANK { background-color: White; }
+TD.OK { background-color: Lime; }
+TD.RESULT { background-color: Green; }
+TD.untested { background-color: White; }
+TD.CONNECT { background-color: Yellow; }
+TD.TRANSPORT { background-color: Yellow; }
+TD.WSDL { background-color: Yellow; }
+TD.WSDLCACHE { background-color: Yellow; }
+TD.WSDLPARSER { background-color: Yellow; }
+TD.HTTP { background-color: Yellow; }
+TD.SMTP { background-color: Yellow; }
+</style>
+ <title>PHP SOAP Client Interop Test Results</title>
+</head>
+
+<body bgcolor="White" text="Black">
+<h2 align="center">PHP SOAP Client Interop Test Results: Round2</h2>
+
+<a href="index.php">Back to Interop Index</a><br>
+<p>&nbsp;</p>
+
+<?php
+$iop = new Interop_Client();
+
+if ($_GET['detail'] == 1) $iop->showFaults = 1;
+
+if ($_GET['wire']) {
+ $iop->showWire($_GET['wire']);
+} else {
+ $iop->getEndpoints();
+ $iop->getResults();
+
+ if ($_GET['test']) {
+ $iop->currentTest = $_GET['test'];
+ $iop->useWSDL = $_GET['wsdl']?$_GET['wsdl']:0;
+ $iop->paramType = $_GET['type']?$_GET['type']:'php';
+ $iop->outputTable();
+ } else {
+ $iop->outputTables();
+ }
+}
+?>
+</body>
+</html>
diff --git a/ext/soap/interop/client_round2_run.php b/ext/soap/interop/client_round2_run.php
new file mode 100644
index 0000000..86f30f8
--- /dev/null
+++ b/ext/soap/interop/client_round2_run.php
@@ -0,0 +1,53 @@
+<?php
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+set_time_limit(0);
+require_once 'client_round2_interop.php';
+
+$iop = new Interop_Client();
+$iop->html = 0;
+
+// force a fetch of endpoints, this happens irregardless if no endpoints in database
+$iop->fetchEndpoints();
+
+// set some options
+$iop->currentTest = 'GroupC'; // see $tests above
+$iop->paramType = 'php'; // 'php' or 'soapval'
+$iop->useWSDL = 1; // 1= do wsdl tests
+$iop->numServers = 0; // 0 = all
+//$iop->specificEndpoint = 'PHP ext/soap'; // test only this endpoint
+//$iop->testMethod = 'echoString'; // test only this method
+
+// endpoints to skip
+//$iop->skipEndpointList = array('Apache Axis','IONA XMLBus','IONA XMLBus (CORBA)','MS SOAP ToolKit 2.0','MS SOAP ToolKit 3.0','Spheon JSOAP','SQLData SOAP Server','WASP Advanced 3.0');
+$iop->startAt='';
+$iop->nosave = 0; // 1= disable saving results to database
+// debug output
+$iop->show = 1;
+$iop->debug = 0;
+$iop->showFaults = 0; // used in result table output
+
+$iop->doTest(); // run a single set of tests using above options
+#$iop->doGroupTests(); // run a group of tests set in $currentTest
+#$iop->doTests(); // run all tests, ignore above options
+#$iop->outputTables();
+echo "done\n";
+
+?>
diff --git a/ext/soap/interop/config.php.dist b/ext/soap/interop/config.php.dist
new file mode 100644
index 0000000..afdeaf9
--- /dev/null
+++ b/ext/soap/interop/config.php.dist
@@ -0,0 +1,5 @@
+<?php
+// configuration items
+$interopConfig['DSN'] = 'mysql://root@localhost/soapinterop';
+$interopConfig['baseURL'] = 'http://localhost/soap/interop';
+?> \ No newline at end of file
diff --git a/ext/soap/interop/database_round2.sql b/ext/soap/interop/database_round2.sql
new file mode 100644
index 0000000..6834b0e
--- /dev/null
+++ b/ext/soap/interop/database_round2.sql
@@ -0,0 +1,44 @@
+# phpMyAdmin MySQL-Dump
+# version 2.2.5
+# http://phpwizard.net/phpMyAdmin/
+# http://phpmyadmin.sourceforge.net/ (download page)
+#
+# Host: localhost
+# Generation Time: Apr 08, 2002 at 08:32 PM
+# Server version: 3.23.49
+# PHP Version: 4.1.1
+# Database : `interop`
+# --------------------------------------------------------
+
+#
+# Table structure for table `endpoints`
+#
+
+CREATE TABLE endpoints (
+ id int(11) NOT NULL auto_increment,
+ endpointName varchar(50) NOT NULL default '',
+ endpointURL varchar(255) NOT NULL default '',
+ wsdlURL varchar(255) NOT NULL default '',
+ class varchar(20) NOT NULL default '',
+ status int(11) NOT NULL default '1',
+ PRIMARY KEY (id)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Table structure for table `results`
+#
+
+CREATE TABLE results (
+ id int(11) NOT NULL auto_increment,
+ endpoint int(11) NOT NULL default '0',
+ stamp int(11) NOT NULL default '0',
+ class varchar(10) NOT NULL default '',
+ type varchar(10) default NULL,
+ wsdl int(11) NOT NULL default '0',
+ function varchar(255) NOT NULL default '',
+ result varchar(25) NOT NULL default '',
+ error text,
+ wire text NOT NULL,
+ PRIMARY KEY (id)
+) TYPE=MyISAM;
diff --git a/ext/soap/interop/echoheadersvc.wsdl.php b/ext/soap/interop/echoheadersvc.wsdl.php
new file mode 100644
index 0000000..e707024
--- /dev/null
+++ b/ext/soap/interop/echoheadersvc.wsdl.php
@@ -0,0 +1,398 @@
+<?php
+header("Content-Type: text/xml");
+echo '<?xml version="1.0"?>';
+echo "\n";
+?>
+<definitions name="InteropTest" targetNamespace="http://soapinterop.org/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://soapinterop.org/" xmlns:s="http://soapinterop.org/xsd" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
+ <types>
+ <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://soapinterop.org/xsd">
+
+ <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
+
+ <complexType name="ArrayOfstring">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOfint">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="int[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOffloat">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="float[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOfSOAPStruct">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="s:SOAPStruct[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="SOAPStruct">
+ <all>
+ <element name="varString" type="string" nillable="true"/>
+ <element name="varInt" type="int" nillable="true"/>
+ <element name="varFloat" type="float" nillable="true"/>
+ </all>
+ </complexType>
+ </schema>
+ </types>
+
+ <message name="echoHeaderString_Request">
+ <part name="echoMeStringRequest" type="xsd:string"/>
+ </message>
+ <message name="echoHeaderString_Response">
+ <part name="echoMeStringResponse" type="xsd:string"/>
+ </message>
+ <message name="echoHeaderStruct_Request">
+ <part name="echoMeStructRequest" type="s:SOAPStruct"/>
+ </message>
+ <message name="echoHeaderStruct_Response">
+ <part name="echoMeStructResponse" type="s:SOAPStruct"/>
+ </message>
+ <message name="echoStringRequest">
+ <part name="inputString" type="xsd:string"/>
+ </message>
+ <message name="echoStringResponse">
+ <part name="return" type="xsd:string"/>
+ </message>
+ <message name="echoStringArrayRequest">
+ <part name="inputStringArray" type="s:ArrayOfstring"/>
+ </message>
+ <message name="echoStringArrayResponse">
+ <part name="return" type="s:ArrayOfstring"/>
+ </message>
+ <message name="echoIntegerRequest">
+ <part name="inputInteger" type="xsd:int"/>
+ </message>
+ <message name="echoIntegerResponse">
+ <part name="return" type="xsd:int"/>
+ </message>
+ <message name="echoIntegerArrayRequest">
+ <part name="inputIntegerArray" type="s:ArrayOfint"/>
+ </message>
+ <message name="echoIntegerArrayResponse">
+ <part name="return" type="s:ArrayOfint"/>
+ </message>
+ <message name="echoFloatRequest">
+ <part name="inputFloat" type="xsd:float"/>
+ </message>
+ <message name="echoFloatResponse">
+ <part name="return" type="xsd:float"/>
+ </message>
+ <message name="echoFloatArrayRequest">
+ <part name="inputFloatArray" type="s:ArrayOffloat"/>
+ </message>
+ <message name="echoFloatArrayResponse">
+ <part name="return" type="s:ArrayOffloat"/>
+ </message>
+ <message name="echoStructRequest">
+ <part name="inputStruct" type="s:SOAPStruct"/>
+ </message>
+ <message name="echoStructResponse">
+ <part name="return" type="s:SOAPStruct"/>
+ </message>
+ <message name="echoStructArrayRequest">
+ <part name="inputStructArray" type="s:ArrayOfSOAPStruct"/>
+ </message>
+ <message name="echoStructArrayResponse">
+ <part name="return" type="s:ArrayOfSOAPStruct"/>
+ </message>
+ <message name="echoVoidRequest"/>
+ <message name="echoVoidResponse"/>
+ <message name="echoBase64Request">
+ <part name="inputBase64" type="xsd:base64Binary"/>
+ </message>
+ <message name="echoBase64Response">
+ <part name="return" type="xsd:base64Binary"/>
+ </message>
+ <message name="echoDateRequest">
+ <part name="inputDate" type="xsd:dateTime"/>
+ </message>
+ <message name="echoDateResponse">
+ <part name="return" type="xsd:dateTime"/>
+ </message>
+ <message name="echoHexBinaryRequest">
+ <part name="inputHexBinary" type="xsd:hexBinary"/>
+ </message>
+ <message name="echoHexBinaryResponse">
+ <part name="return" type="xsd:hexBinary"/>
+ </message>
+ <message name="echoDecimalRequest">
+ <part name="inputDecimal" type="xsd:decimal"/>
+ </message>
+ <message name="echoDecimalResponse">
+ <part name="return" type="xsd:decimal"/>
+ </message>
+ <message name="echoBooleanRequest">
+ <part name="inputBoolean" type="xsd:boolean"/>
+ </message>
+ <message name="echoBooleanResponse">
+ <part name="return" type="xsd:boolean"/>
+ </message>
+
+ <portType name="InteropTestPortType">
+ <operation name="echoString" parameterOrder="inputString">
+ <input message="tns:echoStringRequest"/>
+ <output message="tns:echoStringResponse"/>
+ </operation>
+ <operation name="echoStringArray" parameterOrder="inputStringArray">
+ <input message="tns:echoStringArrayRequest"/>
+ <output message="tns:echoStringArrayResponse"/>
+ </operation>
+ <operation name="echoInteger" parameterOrder="inputInteger">
+ <input message="tns:echoIntegerRequest"/>
+ <output message="tns:echoIntegerResponse"/>
+ </operation>
+ <operation name="echoIntegerArray" parameterOrder="inputIntegerArray">
+ <input message="tns:echoIntegerArrayRequest"/>
+ <output message="tns:echoIntegerArrayResponse"/>
+ </operation>
+ <operation name="echoFloat" parameterOrder="inputFloat">
+ <input message="tns:echoFloatRequest"/>
+ <output message="tns:echoFloatResponse"/>
+ </operation>
+ <operation name="echoFloatArray" parameterOrder="inputFloatArray">
+ <input message="tns:echoFloatArrayRequest"/>
+ <output message="tns:echoFloatArrayResponse"/>
+ </operation>
+ <operation name="echoStruct" parameterOrder="inputStruct">
+ <input message="tns:echoStructRequest"/>
+ <output message="tns:echoStructResponse"/>
+ </operation>
+ <operation name="echoStructArray" parameterOrder="inputStructArray">
+ <input message="tns:echoStructArrayRequest"/>
+ <output message="tns:echoStructArrayResponse"/>
+ </operation>
+ <operation name="echoVoid">
+ <input message="tns:echoVoidRequest"/>
+ <output message="tns:echoVoidResponse"/>
+ </operation>
+ <operation name="echoBase64" parameterOrder="inputBase64">
+ <input message="tns:echoBase64Request"/>
+ <output message="tns:echoBase64Response"/>
+ </operation>
+ <operation name="echoDate" parameterOrder="inputDate">
+ <input message="tns:echoDateRequest"/>
+ <output message="tns:echoDateResponse"/>
+ </operation>
+ <operation name="echoHexBinary" parameterOrder="inputHexBinary">
+ <input message="tns:echoHexBinaryRequest"/>
+ <output message="tns:echoHexBinaryResponse"/>
+ </operation>
+ <operation name="echoDecimal" parameterOrder="inputDecimal">
+ <input message="tns:echoDecimalRequest"/>
+ <output message="tns:echoDecimalResponse"/>
+ </operation>
+ <operation name="echoBoolean" parameterOrder="inputBoolean">
+ <input message="tns:echoBooleanRequest"/>
+ <output message="tns:echoBooleanResponse"/>
+ </operation>
+ </portType>
+
+ <binding name="InteropEchoHeaderBinding" type="tns:InteropTestPortType">
+ <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+
+ <operation name="echoString">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStringArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoInteger">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoIntegerArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoFloat">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoFloatArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStruct">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStructArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoVoid">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoBase64">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoDate">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoHexBinary">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoDecimal">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoBoolean">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Request" part="echoMeStringRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Request" part="echoMeStructRequest" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderString_Response" part="echoMeStringResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ <soap:header use="encoded" message="tns:echoHeaderStruct_Response" part="echoMeStructResponse" namespace="http://soapinterop.org/echoheader/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+
+ </binding>
+
+ <service name="interopLabEchoHeader">
+
+ <port name="interopPortEchoHdr" binding="tns:InteropEchoHeaderBinding">
+ <soap:address location="<?php echo ((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));?>/server_round2_groupC.php"/>
+ </port>
+
+ </service>
+</definitions>
diff --git a/ext/soap/interop/index.php b/ext/soap/interop/index.php
new file mode 100644
index 0000000..1ae25d9
--- /dev/null
+++ b/ext/soap/interop/index.php
@@ -0,0 +1,59 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
+<html>
+<head>
+ <title>PHP SOAP Interop</title>
+</head>
+<?php
+// get our endpoint
+$server = $_SERVER['HTTP_HOST'].':'.$_SERVER['SERVER_PORT'];
+$base = (isset($_SERVER['HTTPS'])?"https://":"http://").$server.dirname($_SERVER['PHP_SELF'])."/interop.wsdl.php";
+$groupb = (isset($_SERVER['HTTPS'])?"https://":"http://").$server.dirname($_SERVER['PHP_SELF'])."/interopB.wsdl.php";
+$groupc = (isset($_SERVER['HTTPS'])?"https://":"http://").$server.dirname($_SERVER['PHP_SELF'])."/echoheadersvc.wsdl.php";
+?>
+<body>
+
+<h2 align='center'>PHP SOAP Interop</h2>
+<p>Welcome to the PHP SOAP Interop pages. These pages are set up for
+SOAP Builder interop tests. You can find out more about the interop tests
+at <a href="http://www.whitemesa.com/interop.htm">White Mesa</a>.</p>
+<p>Currently Round 2 base, Group B and Group C interop tests are enabled.</p>
+
+<h3>Round 2 Interop Server</h3>
+Base WSDL: <a href="<?php echo $base ?>"><?php echo $base ?></a><br>
+Group B WSDL: <a href="<?php echo $groupb ?>"><?php echo $groupb ?></a><br>
+Group C WSDL: <a href="<?php echo $groupc ?>"><?php echo $groupc ?></a><br>
+
+<h3>Interop Client</h3>
+
+<p>Notes: Tests are done both "Direct" and with "WSDL". WSDL tests use the supplied interop WSDL
+to run the tests against. The Direct method uses an internal prebuilt list of methods and parameters
+for the test.</p>
+<p>Tests are also run against two methods of generating method parameters. The first, 'php', attempts
+to directly serialize PHP variables into soap values. The second method, 'soapval', uses a SoapParam and SoapVar
+classes to define what the type of the value is.</p>
+
+<h3>Client Test Interface</h3>
+<p>The <a href="client_round2.php">client interface</a> allows you to run the PHP SOAP
+Client against a choosen interop server. Each run updates the results database below.</p>
+
+<h3>Interop Client Test Results</h3>
+<p>This is a database of the current test results using PHP SOAP Clients against interop servers.</p>
+<p>More detail (wire) about errors (marked yellow or red) can be obtained by clicking on the
+link in the result box. If we have an HTTP error
+attempting to connect to the endpoint, we will mark all consecutive attempts as errors, and skip
+testing that endpoint. This reduces the time it takes to run the tests if a server is unavailable.</p>
+<ul>
+<li><a href="client_round2_results.php?test=base&type=php&wsdl=0">Base results using PHP native types</a></li>
+<li><a href="client_round2_results.php?test=base&type=soapval&wsdl=0">Base results using SOAP types</a></li>
+<li><a href="client_round2_results.php?test=base&type=php&wsdl=1">Base results using PHP native types with WSDL</a></li>
+<li><a href="client_round2_results.php?test=GroupB&type=php&wsdl=0">Group B results using PHP native types</a></li>
+<li><a href="client_round2_results.php?test=GroupB&type=soapval&wsdl=0">Group B results using SOAP types</a></li>
+<li><a href="client_round2_results.php?test=GroupB&type=php&wsdl=1">Group B results using PHP native types with WSDL</a></li>
+<li><a href="client_round2_results.php?test=GroupC&type=php&wsdl=0">Group C results using PHP native types</a></li>
+<li><a href="client_round2_results.php?test=GroupC&type=soapval&wsdl=0">Group C results using SOAP types</a></li>
+<li><a href="client_round2_results.php?test=GroupC&type=php&wsdl=1">Group C results using PHP native types with WSDL</a></li>
+<li><a href="client_round2_results.php">Show All Results</a></li>
+</ul>
+</body>
+</html>
diff --git a/ext/soap/interop/interop.wsdl.php b/ext/soap/interop/interop.wsdl.php
new file mode 100644
index 0000000..6ed2d17
--- /dev/null
+++ b/ext/soap/interop/interop.wsdl.php
@@ -0,0 +1,336 @@
+<?php
+header("Content-Type: text/xml");
+echo '<?xml version="1.0"?>';
+echo "\n";
+?>
+<definitions name="InteropTest"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:tns="http://soapinterop.org/"
+ xmlns:s="http://soapinterop.org/xsd"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/"
+ targetNamespace="http://soapinterop.org/">
+
+ <types>
+ <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://soapinterop.org/xsd">
+ <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
+ <xsd:import namespace="http://schemas.xmlsoap.org/wsdl/" />
+ <xsd:complexType name="ArrayOfstring">
+ <xsd:complexContent>
+ <xsd:restriction base="SOAP-ENC:Array">
+ <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[]"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+ <xsd:complexType name="ArrayOfint">
+ <xsd:complexContent>
+ <xsd:restriction base="SOAP-ENC:Array">
+ <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="int[]"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+ <xsd:complexType name="ArrayOffloat">
+ <xsd:complexContent>
+ <xsd:restriction base="SOAP-ENC:Array">
+ <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="float[]"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+ <xsd:complexType name="SOAPStruct">
+ <xsd:all>
+ <xsd:element name="varString" type="string"/>
+ <xsd:element name="varInt" type="int"/>
+ <xsd:element name="varFloat" type="float"/>
+ </xsd:all>
+ </xsd:complexType>
+ <xsd:complexType name="ArrayOfSOAPStruct">
+ <xsd:complexContent>
+ <xsd:restriction base="SOAP-ENC:Array">
+ <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="s:SOAPStruct[]"/>
+ </xsd:restriction>
+ </xsd:complexContent>
+ </xsd:complexType>
+ </schema>
+ </types>
+
+ <message name="echoStringRequest">
+ <part name="inputString" type="xsd:string" />
+ </message>
+ <message name="echoStringResponse">
+ <part name="outputString" type="xsd:string" />
+ </message>
+ <message name="echoStringArrayRequest">
+ <part name="inputStringArray" type="s:ArrayOfstring" />
+ </message>
+ <message name="echoStringArrayResponse">
+ <part name="outputStringArray" type="s:ArrayOfstring" />
+ </message>
+ <message name="echoIntegerRequest">
+ <part name="inputInteger" type="xsd:int" />
+ </message>
+ <message name="echoIntegerResponse">
+ <part name="outputInteger" type="xsd:int" />
+ </message>
+ <message name="echoIntegerArrayRequest">
+ <part name="inputIntegerArray" type="s:ArrayOfint" />
+ </message>
+ <message name="echoIntegerArrayResponse">
+ <part name="outputIntegerArray" type="s:ArrayOfint" />
+ </message>
+ <message name="echoFloatRequest">
+ <part name="inputFloat" type="xsd:float" />
+ </message>
+ <message name="echoFloatResponse">
+ <part name="outputFloat" type="xsd:float" />
+ </message>
+ <message name="echoFloatArrayRequest">
+ <part name="inputFloatArray" type="s:ArrayOffloat" />
+ </message>
+ <message name="echoFloatArrayResponse">
+ <part name="outputFloatArray" type="s:ArrayOffloat" />
+ </message>
+ <message name="echoStructRequest">
+ <part name="inputStruct" type="s:SOAPStruct" />
+ </message>
+ <message name="echoStructResponse">
+ <part name="outputStruct" type="s:SOAPStruct" />
+ </message>
+ <message name="echoStructArrayRequest">
+ <part name="inputStructArray" type="s:ArrayOfSOAPStruct" />
+ </message>
+ <message name="echoStructArrayResponse">
+ <part name="outputStructArray" type="s:ArrayOfSOAPStruct" />
+ </message>
+ <message name="echoVoidRequest">
+ </message>
+ <message name="echoVoidResponse">
+ </message>
+ <message name="echoBase64Request">
+ <part name="inputBase64" type="xsd:base64Binary" />
+ </message>
+ <message name="echoBase64Response">
+ <part name="outputBase64" type="xsd:base64Binary" />
+ </message>
+ <message name="echoDateRequest">
+ <part name="inputDate" type="xsd:dateTime" />
+ </message>
+ <message name="echoDateResponse">
+ <part name="outputDate" type="xsd:dateTime" />
+ </message>
+ <message name="echoHexBinaryRequest">
+ <part name="inputHexBinary" type="xsd:hexBinary" />
+ </message>
+ <message name="echoHexBinaryResponse">
+ <part name="outputHexBinary" type="xsd:hexBinary" />
+ </message>
+ <message name="echoDecimalRequest">
+ <part name="inputDecimal" type="xsd:decimal" />
+ </message>
+ <message name="echoDecimalResponse">
+ <part name="outputDecimal" type="xsd:decimal" />
+ </message>
+ <message name="echoBooleanRequest">
+ <part name="inputBoolean" type="xsd:boolean" />
+ </message>
+ <message name="echoBooleanResponse">
+ <part name="outputBoolean" type="xsd:boolean" />
+ </message>
+
+ <portType name="InteropTestPortType">
+ <operation name="echoString">
+ <input message="tns:echoStringRequest"/>
+ <output message="tns:echoStringResponse"/>
+ </operation>
+ <operation name="echoStringArray">
+ <input message="tns:echoStringArrayRequest"/>
+ <output message="tns:echoStringArrayResponse"/>
+ </operation>
+ <operation name="echoInteger">
+ <input message="tns:echoIntegerRequest"/>
+ <output message="tns:echoIntegerResponse"/>
+ </operation>
+ <operation name="echoIntegerArray">
+ <input message="tns:echoIntegerArrayRequest"/>
+ <output message="tns:echoIntegerArrayResponse"/>
+ </operation>
+ <operation name="echoFloat">
+ <input message="tns:echoFloatRequest"/>
+ <output message="tns:echoFloatResponse"/>
+ </operation>
+ <operation name="echoFloatArray">
+ <input message="tns:echoFloatArrayRequest"/>
+ <output message="tns:echoFloatArrayResponse"/>
+ </operation>
+ <operation name="echoStruct">
+ <input message="tns:echoStructRequest"/>
+ <output message="tns:echoStructResponse"/>
+ </operation>
+ <operation name="echoStructArray">
+ <input message="tns:echoStructArrayRequest"/>
+ <output message="tns:echoStructArrayResponse"/>
+ </operation>
+ <operation name="echoVoid">
+ <input message="tns:echoVoidRequest"/>
+ <output message="tns:echoVoidResponse"/>
+ </operation>
+ <operation name="echoBase64">
+ <input message="tns:echoBase64Request"/>
+ <output message="tns:echoBase64Response"/>
+ </operation>
+ <operation name="echoDate">
+ <input message="tns:echoDateRequest"/>
+ <output message="tns:echoDateResponse"/>
+ </operation>
+ <operation name="echoHexBinary">
+ <input message="tns:echoHexBinaryRequest"/>
+ <output message="tns:echoHexBinaryResponse"/>
+ </operation>
+ <operation name="echoDecimal">
+ <input message="tns:echoDecimalRequest"/>
+ <output message="tns:echoDecimalResponse"/>
+ </operation>
+ <operation name="echoBoolean">
+ <input message="tns:echoBooleanRequest"/>
+ <output message="tns:echoBooleanResponse"/>
+ </operation>
+ </portType>
+
+ <binding name="InteropTestBinding" type="tns:InteropTestPortType">
+ <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="echoString">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStringArray">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoInteger">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoIntegerArray">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoFloat">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoFloatArray">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStruct">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoStructArray">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoVoid">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoBase64">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoDate">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoHexBinary">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoDecimal">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoBoolean">
+ <soap:operation soapAction="http://" style="rpc"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ </binding>
+
+ <service name="InteropTest">
+ <port name="InteropTestPort" binding="tns:InteropTestBinding">
+ <soap:address location="<?php echo ((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));?>/server_round2_base.php"/>
+ </port>
+ </service>
+
+</definitions>
diff --git a/ext/soap/interop/interopB.wsdl.php b/ext/soap/interop/interopB.wsdl.php
new file mode 100644
index 0000000..3113b1c
--- /dev/null
+++ b/ext/soap/interop/interopB.wsdl.php
@@ -0,0 +1,196 @@
+<?php
+header("Content-Type: text/xml");
+echo '<?xml version="1.0"?>';
+echo "\n";
+?>
+<definitions name="InteropTest"
+ targetNamespace="http://soapinterop.org/"
+ xmlns="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
+ xmlns:tns="http://soapinterop.org/"
+ xmlns:s="http://soapinterop.org/xsd"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
+ <types>
+ <schema xmlns="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://soapinterop.org/xsd">
+
+ <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
+
+ <complexType name="ArrayOfstring">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOfint">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="int[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOffloat">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="float[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="ArrayOfSOAPStruct">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="s:SOAPStruct[]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ <complexType name="SOAPStruct">
+ <all>
+ <element name="varString" type="string" nillable="true"/>
+ <element name="varInt" type="int" nillable="true"/>
+ <element name="varFloat" type="float" nillable="true"/>
+ </all>
+ </complexType>
+ <complexType name="SOAPStructStruct">
+ <all>
+ <element name="varString" type="string" nillable="true"/>
+ <element name="varInt" type="int" nillable="true"/>
+ <element name="varFloat" type="float" nillable="true"/>
+ <element name="varStruct" type="s:SOAPStruct"/>
+ </all>
+ </complexType>
+ <complexType name="SOAPArrayStruct">
+ <all>
+ <element name="varString" type="string" nillable="true"/>
+ <element name="varInt" type="int" nillable="true"/>
+ <element name="varFloat" type="float" nillable="true"/>
+ <element name="varArray" type="s:ArrayOfstring"/>
+ </all>
+ </complexType>
+ <complexType name="ArrayOfString2D">
+ <complexContent>
+ <restriction base="SOAP-ENC:Array">
+ <attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="string[,]"/>
+ </restriction>
+ </complexContent>
+ </complexType>
+ </schema>
+ </types>
+
+ <message name="echoStructAsSimpleTypesRequest">
+ <part name="inputStruct" type="s:SOAPStruct"/>
+ </message>
+ <message name="echoStructAsSimpleTypesResponse">
+ <part name="outputString" type="xsd:string"/>
+ <part name="outputInteger" type="xsd:int"/>
+ <part name="outputFloat" type="xsd:float"/>
+ </message>
+ <message name="echoSimpleTypesAsStructRequest">
+ <part name="inputString" type="xsd:string"/>
+ <part name="inputInteger" type="xsd:int"/>
+ <part name="inputFloat" type="xsd:float"/>
+ </message>
+ <message name="echoSimpleTypesAsStructResponse">
+ <part name="return" type="s:SOAPStruct"/>
+ </message>
+ <message name="echo2DStringArrayRequest">
+ <part name="input2DStringArray" type="s:ArrayOfString2D"/>
+ </message>
+ <message name="echo2DStringArrayResponse">
+ <part name="return" type="s:ArrayOfString2D"/>
+ </message>
+ <message name="echoNestedStructRequest">
+ <part name="inputStruct" type="s:SOAPStructStruct"/>
+ </message>
+ <message name="echoNestedStructResponse">
+ <part name="return" type="s:SOAPStructStruct"/>
+ </message>
+ <message name="echoNestedArrayRequest">
+ <part name="inputStruct" type="s:SOAPArrayStruct"/>
+ </message>
+ <message name="echoNestedArrayResponse">
+ <part name="return" type="s:SOAPArrayStruct"/>
+ </message>
+
+ <portType name="InteropTestPortTypeB">
+ <operation name="echoStructAsSimpleTypes" parameterOrder="inputStruct outputString outputInteger outputFloat">
+ <input message="tns:echoStructAsSimpleTypesRequest" name="echoStructAsSimpleTypes"/>
+ <output message="tns:echoStructAsSimpleTypesResponse" name="echoStructAsSimpleTypesResponse"/>
+ </operation>
+ <operation name="echoSimpleTypesAsStruct" parameterOrder="inputString inputInteger inputFloat">
+ <input message="tns:echoSimpleTypesAsStructRequest" name="echoSimpleTypesAsStruct"/>
+ <output message="tns:echoSimpleTypesAsStructResponse" name="echoSimpleTypesAsStructResponse"/>
+ </operation>
+ <operation name="echo2DStringArray" parameterOrder="input2DStringArray">
+ <input message="tns:echo2DStringArrayRequest" name="echo2DStringArray"/>
+ <output message="tns:echo2DStringArrayResponse" name="echo2DStringArrayResponse"/>
+ </operation>
+ <operation name="echoNestedStruct" parameterOrder="inputStruct">
+ <input message="tns:echoNestedStructRequest" name="echoNestedStruct"/>
+ <output message="tns:echoNestedStructResponse" name="echoNestedStructResponse"/>
+ </operation>
+ <operation name="echoNestedArray" parameterOrder="inputStruct">
+ <input message="tns:echoNestedArrayRequest" name="echoNestedArray"/>
+ <output message="tns:echoNestedArrayResponse" name="echoNestedArrayResponse"/>
+ </operation>
+ </portType>
+
+ <binding name="InteropTestSoapBindingB" type="tns:InteropTestPortTypeB">
+ <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="echoStructAsSimpleTypes">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoSimpleTypesAsStruct">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echo2DStringArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoNestedStruct">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ <operation name="echoNestedArray">
+ <soap:operation soapAction="http://soapinterop.org/"/>
+ <input>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </input>
+ <output>
+ <soap:body use="encoded" namespace="http://soapinterop.org/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
+ </output>
+ </operation>
+ </binding>
+
+ <service name="interopLabB">
+ <port name="interopTestPortB" binding="tns:InteropTestSoapBindingB">
+ <soap:address location="<?php echo ((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));?>/server_round2_groupB.php"/>
+ </port>
+ </service>
+
+</definitions>
diff --git a/ext/soap/interop/server_round2_base.php b/ext/soap/interop/server_round2_base.php
new file mode 100644
index 0000000..1cfe57d
--- /dev/null
+++ b/ext/soap/interop/server_round2_base.php
@@ -0,0 +1,105 @@
+<?
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> Port to PEAR and more |
+// | Authors: Dietrich Ayala <dietrich@ganx4.com> Original Author |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+class SOAP_Interop_Base {
+
+ function echoString($inputString)
+ {
+ return $inputString;
+ }
+
+ function echoStringArray($inputStringArray)
+ {
+ return $inputStringArray;
+ }
+
+
+ function echoInteger($inputInteger)
+ {
+ return $inputInteger;
+ }
+
+ function echoIntegerArray($inputIntegerArray)
+ {
+ return $inputIntegerArray;
+ }
+
+ function echoFloat($inputFloat)
+ {
+ return $inputFloat;
+ }
+
+ function echoFloatArray($inputFloatArray)
+ {
+ return $inputFloatArray;
+ }
+
+ function echoStruct($inputStruct)
+ {
+ return $inputStruct;
+ }
+
+ function echoStructArray($inputStructArray)
+ {
+ return $inputStructArray;
+ }
+
+ function echoVoid()
+ {
+ return NULL;
+ }
+
+ function echoBase64($b_encoded)
+ {
+ return $b_encoded;
+ }
+
+ function echoDate($timeInstant)
+ {
+ return $timeInstant;
+ }
+
+ function echoHexBinary($hb)
+ {
+ return $hb;
+ }
+
+ function echoDecimal($dec)
+ {
+ return $dec;
+ }
+
+ function echoBoolean($boolean)
+ {
+ return $boolean;
+ }
+
+ function echoMimeAttachment($stuff)
+ {
+ return new SOAP_Attachment('return','application/octet-stream',NULL,$stuff);
+ }
+}
+
+$server = new SoapServer((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/interop.wsdl.php");
+$server->setClass("SOAP_Interop_Base");
+$server->handle();
+?> \ No newline at end of file
diff --git a/ext/soap/interop/server_round2_groupB.php b/ext/soap/interop/server_round2_groupB.php
new file mode 100644
index 0000000..9b63bc7
--- /dev/null
+++ b/ext/soap/interop/server_round2_groupB.php
@@ -0,0 +1,58 @@
+<?
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> Port to PEAR and more |
+// | Authors: Dietrich Ayala <dietrich@ganx4.com> Original Author |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+class SOAP_Interop_GroupB {
+
+ function echoStructAsSimpleTypes ($struct)
+ {
+ return array('outputString' => $struct->varString,
+ 'outputInteger' => $struct->varInt,
+ 'outputFloat' => $struct->varFloat);
+ }
+
+ function echoSimpleTypesAsStruct($string, $int, $float)
+ {
+ return (object)array("varString" => $string,
+ "varInt" => $int,
+ "varFloat" => $float);
+ }
+
+ function echoNestedStruct($struct)
+ {
+ return $struct;
+ }
+
+ function echo2DStringArray($ary)
+ {
+ return $ary;
+ }
+
+ function echoNestedArray($ary)
+ {
+ return $ary;
+ }
+}
+
+$server = new SoapServer((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/interopB.wsdl.php");
+$server->setClass("SOAP_Interop_GroupB");
+$server->handle();
+?> \ No newline at end of file
diff --git a/ext/soap/interop/server_round2_groupC.php b/ext/soap/interop/server_round2_groupC.php
new file mode 100644
index 0000000..1ca042e
--- /dev/null
+++ b/ext/soap/interop/server_round2_groupC.php
@@ -0,0 +1,43 @@
+<?
+//
+// +----------------------------------------------------------------------+
+// | PHP Version 4 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2003 The PHP Group |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.02 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available through the world-wide-web at |
+// | http://www.php.net/license/2_02.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Shane Caraveo <Shane@Caraveo.com> |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+
+class SOAP_Interop_GroupC {
+ var $method_namespace = 'http://soapinterop.org/echoheader/';
+
+ function echoMeStringRequest($string)
+ {
+ return new SoapHeader($this->method_namespace, "echoMeStringResponse", $string);
+ }
+
+ function echoMeStructRequest($struct)
+ {
+ return new SoapHeader($this->method_namespace, "echoMeStructResponse", $struct);
+ }
+
+ function echoVoid()
+ {
+ }
+}
+
+$server = new SoapServer((isset($_SERVER['HTTPS'])?"https://":"http://").$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/echoheadersvc.wsdl.php");
+$server->setClass("SOAP_Interop_GroupC");
+$server->handle();
+?> \ No newline at end of file
diff --git a/ext/soap/interop/test.utility.php b/ext/soap/interop/test.utility.php
new file mode 100644
index 0000000..5b1f699
--- /dev/null
+++ b/ext/soap/interop/test.utility.php
@@ -0,0 +1,143 @@
+<?php
+
+function timestamp_to_soap_datetime($t) {
+ return date('Y-m-d\TH:i:sO',$t);
+}
+
+function soap_datetime_to_timestamp($t) {
+ /* Ignore Microsecconds */
+ $iso8601 = '(-?[0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]*)?(Z|[+\-][0-9]{4}|[+\-][0-9]{2}:[0-9]{2})?';
+ if (!is_int($t)) {
+ if (!ereg($iso8601,$t,$r)) {
+ return false;
+ }
+ $t = gmmktime($r[4],$r[5],$r[6],$r[2],$r[3],$r[1]);
+ if (!empty($r[8]) && $r[8] != 'Z') {
+ $op = substr($r[8],0,1);
+ $h = substr($r[8],1,2);
+ if (strstr($r[8],':')) {
+ $m = substr($r[8],4,2);
+ } else {
+ $m = substr($r[8],3,2);
+ }
+ $t += (($op == "-"?1:-1) * $h * 60 + $m) * 60;
+ }
+ }
+ return $t;
+}
+
+function date_compare($f1,$f2)
+{
+ return soap_datetime_to_timestamp($f1) == soap_datetime_to_timestamp($f2);
+}
+
+function hex_compare($f1, $f2)
+{
+ return strcasecmp($f1,$f2) == 0;
+}
+
+function number_compare($f1, $f2)
+{
+ # figure out which has the least fractional digits
+ preg_match('/.*?\.(.*)/',$f1,$m1);
+ preg_match('/.*?\.(.*)/',$f2,$m2);
+ #print_r($m1);
+ # always use at least 2 digits of precision
+ $d = max(min(strlen(count($m1)?$m1[1]:'0'),strlen(count($m2)?$m2[1]:'0')),2);
+ $f1 = round($f1, $d);
+ $f2 = round($f2, $d);
+ return $f1 == $f2;
+// return bccomp($f1, $f2, $d) == 0;
+}
+
+function boolean_compare($f1, $f2)
+{
+ if (($f1 == 'true' || $f1 === TRUE || $f1 != 0) &&
+ ($f2 == 'true' || $f2 === TRUE || $f2 != 0)) return TRUE;
+ if (($f1 == 'false' || $f1 === FALSE || $f1 == 0) &&
+ ($f2 == 'false' || $f2 === FALSE || $f2 == 0)) return TRUE;
+ return FALSE;
+}
+
+function string_compare($e1, $e2)
+{
+ if (is_numeric($e1) && is_numeric($e2)) {
+ return number_compare($e1, $e2);
+ }
+ # handle dateTime comparison
+ $e1_type = gettype($e1);
+ $e2_type = gettype($e2);
+ $ok = FALSE;
+ if ($e1_type == "string") {
+// $dt = new SOAP_Type_dateTime();
+// $ok = $dt->compare($e1, $e2) == 0;
+ $oj = false;
+ }
+ return $ok || $e1 == $e2 || strcasecmp(trim($e1), trim($e2)) == 0;
+}
+
+function array_compare(&$ar1, &$ar2) {
+ if (gettype($ar1) != 'array' || gettype($ar2) != 'array') return FALSE;
+ if (count($ar1) != count($ar2)) return FALSE;
+ foreach ($ar1 as $k => $v) {
+ if (!array_key_exists($k,$ar2)) return FALSE;
+ if (!compare($v,$ar2[$k])) return FALSE;
+ }
+ return TRUE;
+}
+
+function object_compare(&$obj1, &$obj2) {
+ if (gettype($obj1) != 'object' || gettype($obj2) != 'object') return FALSE;
+// if (class_name(obj1) != class_name(obj2)) return FALSE;
+ $ar1 = (array)$obj1;
+ $ar2 = (array)$obj2;
+ return array_compare($ar1,$ar2);
+}
+
+function compare(&$x,&$y) {
+ $ok = 0;
+ $x_type = gettype($x);
+ $y_type = gettype($y);
+ if ($x_type == $y_type) {
+ if ($x_type == "array") {
+ $ok = array_compare($x, $y);
+ } else if ($x_type == "object") {
+ $ok = object_compare($x, $y);
+ } else if ($x_type == "double") {
+ $ok = number_compare($x, $y);
+// } else if ($x_type == 'boolean') {
+// $ok = boolean_compare($x, $y);
+ } else {
+ $ok = ($x == $y);
+// $ok = string_compare($expect, $result);
+ }
+ }
+ return $ok;
+}
+
+
+function parseMessage($msg)
+{
+ # strip line endings
+ #$msg = preg_replace('/\r|\n/', ' ', $msg);
+ $response = new SOAP_Parser($msg);
+ if ($response->fault) {
+ return $response->fault->getFault();
+ }
+ $return = $response->getResponse();
+ $v = $response->decode($return);
+ if (gettype($v) == 'array' && count($v)==1) {
+ return array_shift($v);
+ }
+ return $v;
+}
+
+function var_dump_str($var) {
+ ob_start();
+ var_dump($var);
+ $res = ob_get_contents();
+ ob_end_clean();
+ return $res;
+}
+
+?> \ No newline at end of file