X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=src%2FServer.php;h=8540553c382b6023c92532cf1c848c0c5bba10e7;hb=cc67a43993662a5a3f92801b96b89ee6e3998532;hp=089efdf7f970939f7295ccbaa296a51e4287d774;hpb=5a6fe2c4be2af29d295b5756483bffa7f74193f6;p=plcapi.git diff --git a/src/Server.php b/src/Server.php index 089efdf7..8540553c 100644 --- a/src/Server.php +++ b/src/Server.php @@ -179,7 +179,9 @@ class Server * @param string $data the request body. If null, the http POST request will be examined * @param bool $returnPayload When true, return the response but do not echo it or any http header * - * @return Response the response object (usually not used by caller...) + * @return Response|string the response object (usually not used by caller...) or its xml serialization + * + * @throws \Exception in case the executed method does throw an exception (and depending on server configuration) */ public function service($data = null, $returnPayload = false) { @@ -191,13 +193,14 @@ class Server // reset internal debug info $this->debug_info = ''; - // Echo back what we received, before parsing it + // Save what we received, before parsing it if ($this->debug > 1) { $this->debugmsg("+++GOT+++\n" . $data . "\n+++END+++"); } $r = $this->parseRequestHeaders($data, $reqCharset, $respCharset, $respEncoding); if (!$r) { + // this actually executes the request $r = $this->parseRequest($data, $reqCharset); } @@ -446,6 +449,8 @@ class Server * @param string $reqEncoding (optional) the charset encoding of the xml request * * @return Response + * + * @throws \Exception in case the executed method does throw an exception (and depending on server configuration) */ public function parseRequest($data, $reqEncoding = '') { @@ -545,10 +550,13 @@ class Server * * @return Response * - * @throws \Exception in case the executed method does throw an exception (and depending on ) + * @throws \Exception in case the executed method does throw an exception (and depending on server configuration) */ protected function execute($req, $params = null, $paramTypes = null) { + static::$_xmlrpcs_occurred_errors = ''; + static::$_xmlrpc_debuginfo = ''; + if (is_object($req)) { $methName = $req->method(); } else { @@ -603,7 +611,6 @@ class Server // verify that function to be invoked is in fact callable if (!is_callable($func)) { error_log("XML-RPC: " . __METHOD__ . ": function '$funcName' registered as method handler is not callable"); - return new Response( 0, PhpXmlRpc::$xmlrpcerr['server_error'], @@ -616,6 +623,7 @@ class Server if ($this->debug > 2) { self::$_xmlrpcs_prev_ehandler = set_error_handler(array('\PhpXmlRpc\Server', '_xmlrpcs_errorHandler')); } + try { // Allow mixed-convention servers if (is_object($req)) { @@ -670,6 +678,13 @@ class Server // in the called function, we wrap it in a proper error-response switch ($this->exception_handling) { case 2: + if ($this->debug > 2) { + if (self::$_xmlrpcs_prev_ehandler) { + set_error_handler(self::$_xmlrpcs_prev_ehandler); + } else { + restore_error_handler(); + } + } throw $e; break; case 1: @@ -917,7 +932,7 @@ class Server if ($params->kindOf() != 'array') { return static::_xmlrpcs_multicall_error('notarray'); } - $numParams = $params->arraysize(); + $numParams = $params->count(); $req = new Request($methName->scalarval()); for ($i = 0; $i < $numParams; $i++) { @@ -984,7 +999,7 @@ class Server // let accept a plain list of php parameters, beside a single xmlrpc msg object if (is_object($req)) { $calls = $req->getParam(0); - $numCalls = $calls->arraysize(); + $numCalls = $calls->count(); for ($i = 0; $i < $numCalls; $i++) { $call = $calls->arraymem($i); $result[$i] = static::_xmlrpcs_multicall_do_call($server, $call);