summaryrefslogtreecommitdiff
path: root/framework/Web
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Web')
-rw-r--r--framework/Web/Services/TSoapService.php82
1 files changed, 68 insertions, 14 deletions
diff --git a/framework/Web/Services/TSoapService.php b/framework/Web/Services/TSoapService.php
index e4a1c67e..d838217e 100644
--- a/framework/Web/Services/TSoapService.php
+++ b/framework/Web/Services/TSoapService.php
@@ -286,7 +286,11 @@ class TSoapServer extends TApplicationComponent
private $_uri='';
private $_classMap;
private $_persistent=false;
- private $_wsdlUri='';
+ private $_wsdlUri='';
+
+ private $_requestedMethod;
+
+ private $_server;
/**
* @return string the ID of the SOAP server
@@ -316,31 +320,81 @@ class TSoapServer extends TApplicationComponent
{
Prado::using($provider);
$providerClass=($pos=strrpos($provider,'.'))!==false?substr($provider,$pos+1):$provider;
+ $this->guessMethodCallRequested($providerClass);
$server=$this->createServer();
- $server->setClass($providerClass);
+ $server->setClass($providerClass, $this);
if($this->_persistent)
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
}
else
$server=$this->createServer();
try
- {
+ {
$server->handle();
}
catch (Exception $e)
- {
- $server->fault("SERVER", $e->getMessage(),"", $e->__toString(), '');
+ {
+ if($this->getApplication()->getMode()===TApplicationMode::Debug)
+ $this->fault($e->getMessage(), $e->__toString());
+ else
+ $this->fault($e->getMessage());
}
- }
-
- /**
- * Creates the SoapServer instance.
+ }
+
+ /**
+ * Generate a SOAP fault message.
+ * @param string message title
+ * @param mixed message details
+ * @param string message code, defalt is 'SERVER'.
+ * @param string actors
+ * @param string message name
+ */
+ public function fault($title, $details='', $code='SERVER', $actor='', $name='')
+ {
+ $this->_server->fault($code, $title, $actor, $details, $name);
+ }
+
+ /**
+ * Guess the SOAP method request from the actual SOAP message
+ *
+ * @param string $class current handler class.
+ */
+ protected function guessMethodCallRequested($class)
+ {
+ $namespace = $class.'wsdl';
+ $message = file_get_contents("php://input");
+ $matches= array();
+ if(preg_match('/xmlns:([^=]+)="urn:'.$namespace.'"/', $message, $matches))
+ {
+ if(preg_match('/<'.$matches[1].':([a-zA-Z_]+[a-zA-Z0-9_]+)/', $message, $method))
+ {
+ $this->_requestedMethod = $method[1];
+ }
+ }
+ }
+
+ /**
+ * Soap method guessed from the SOAP message received.
+ * @return string soap method request, null if not found.
+ */
+ public function getRequestedMethod()
+ {
+ return $this->_requestedMethod;
+ }
+
+ /**
+ * Creates the SoapServer instance.
+ * @return SoapServer
*/
protected function createServer()
- {
- if($this->getApplication()->getMode()===TApplicationMode::Debug)
- ini_set("soap.wsdl_cache_enabled",0);
- return new SoapServer($this->getWsdlUri(),$this->getOptions());
+ {
+ if($this->_server===null)
+ {
+ if($this->getApplication()->getMode()===TApplicationMode::Debug)
+ ini_set("soap.wsdl_cache_enabled",0);
+ $this->_server = new SoapServer($this->getWsdlUri(),$this->getOptions());
+ }
+ return $this->_server;
}
/**
@@ -533,7 +587,7 @@ class TSoapServer extends TApplicationComponent
/**
* @return string comma delimit list of class names
- */
+ */
public function setClassMaps($classes)
{
$this->_classMap = $classes;