From: <ar...@us...> - 2012-04-13 20:02:14
|
Revision: 40889 http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=40889&view=rev Author: arildb Date: 2012-04-13 20:02:07 +0000 (Fri, 13 Apr 2012) Log Message: ----------- [NEW] Added support for stateful SOAP sessions and getting the full reply from .NET calls using "out" parameters. The statefulness assumes a session cookie is used. These features are disabled by default and must be activated by coding. e.g. $webservice = new Tiki_Webservice; $webservice->allowCookies = true; $fullResponse = true; $reply = $webservice->performRequest($params, $fullResponse); Modified Paths: -------------- branches/8.x/lib/soap/soaplib.php branches/8.x/lib/webservicelib.php Modified: branches/8.x/lib/soap/soaplib.php =================================================================== --- branches/8.x/lib/soap/soaplib.php 2012-04-13 19:38:10 UTC (rev 40888) +++ branches/8.x/lib/soap/soaplib.php 2012-04-13 20:02:07 UTC (rev 40889) @@ -16,7 +16,19 @@ class Tiki_Soap { - public function performRequest( $wsdl, $operation, $params, $options = array( 'encoding' => 'UTF-8' ) ) + private $cookies; + public $allowCookies; // boolean. If true, (session) cookies are handled + + function __construct() { + $this->cookies = array(); + $this->allowCookies = false; + } + + /* + * If fullResponse = true, "out" parameters from .NET calls are included in the response. + * If false, only the <request>Response part of the reply is included. + */ + public function performRequest( $wsdl, $operation, $params, $options = array( 'encoding' => 'UTF-8' ), $fullReponse = false ) { if (!extension_loaded('soap')) { return 'Extension SOAP not found'; @@ -44,14 +56,32 @@ } try { + // Set (Session) cookies before the call + if($this->allowCookies) { + if(is_array($this->cookies)){ + foreach($this->cookies as $cookieName => $cookieValue) { + $client->setCookie($cookieName, $cookieValue[0]); + } + } + } + + // Perform the SOAP request $result = call_user_func_array(array($client, $operation), $soap_params); + // Pick up any new cookies from the server + if($this->allowCookies) { + $last_response = $client->getLastResponseHeaders(); + $soapClt = $client->getSoapClient(); + $this->cookies = array_merge($soapClt->_cookies,$this->cookies); + } + } catch (SoapFault $e) { trigger_error($e->getMessage()); return $e->getMessage(); } - if (is_object($result)) { + // Unless the full response result is specified, only reply the returned result, and not the "out" parameter results + if (is_object($result) && !$fullReponse) { $result_name = $operation . 'Result'; if (isset($result->$result_name)) { Modified: branches/8.x/lib/webservicelib.php =================================================================== --- branches/8.x/lib/webservicelib.php 2012-04-13 19:38:10 UTC (rev 40888) +++ branches/8.x/lib/webservicelib.php 2012-04-13 20:02:07 UTC (rev 40889) @@ -18,6 +18,7 @@ public $wstype; public $schemaVersion; public $schemaDocumentation; + public $allowCookies; private $templates = array(); private $all = false; @@ -132,7 +133,12 @@ return $parameters; } // }}} - function performRequest( $params ) // {{{ + /* + * If fullResponse = true, "out" parameters from .NET calls are included in the response. + * If false, only the <request>Response part of the reply is included. + * fullResponse has no effect for REST calls + */ + function performRequest( $params, $fullReponse = false ) // {{{ { global $soaplib, $prefs; @@ -153,7 +159,8 @@ } $response = new OIntegrate_Response(); - $response->data = $soaplib->performRequest( $built, $this->operation, $map, $options ); + $soaplib->allowCookies = $this->allowCookies; + $response->data = $soaplib->performRequest( $built, $this->operation, $map, $options, $fullReponse ); return $response; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |