Implement interface ArrayAccess in the Value class
[plcapi.git] / src / Server.php
index d8e591d..20ec5a0 100644 (file)
@@ -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);
         }
 
@@ -344,7 +347,7 @@ class Server
     /**
      * Parse http headers received along with xmlrpc request. If needed, inflate request.
      *
-     * @return mixed null on success or a Response
+     * @return mixed Response|null on success or an error Response
      */
     protected function parseRequestHeaders(&$data, &$reqEncoding, &$respEncoding, &$respCompression)
     {
@@ -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:
@@ -899,7 +914,8 @@ class Server
         if ($call->kindOf() != 'struct') {
             return static::_xmlrpcs_multicall_error('notstruct');
         }
-        $methName = @$call->structmem('methodName');
+        //$methName = $call->structmem('methodName');
+        $methName = @$call['methodName'];
         if (!$methName) {
             return static::_xmlrpcs_multicall_error('nomethod');
         }
@@ -910,20 +926,22 @@ class Server
             return static::_xmlrpcs_multicall_error('recursion');
         }
 
-        $params = @$call->structmem('params');
+        //$params = @$call->structmem('params');
+        $params = @$call['params'];
         if (!$params) {
             return static::_xmlrpcs_multicall_error('noparams');
         }
         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++) {
-            if (!$req->addParam($params->arraymem($i))) {
-                $i++;
-
+        //for ($i = 0; $i < $numParams; $i++) {
+        foreach($params as $i => $param) {
+            //if (!$req->addParam($params->arraymem($i))) {
+            if (!$req->addParam($param)) {
+                $i++; // for error message, we count params from 1
                 return static::_xmlrpcs_multicall_error(new Response(0,
                     PhpXmlRpc::$xmlrpcerr['incorrect_params'],
                     PhpXmlRpc::$xmlrpcstr['incorrect_params'] . ": probable xml error in param " . $i));
@@ -966,7 +984,7 @@ class Server
         $pt = array();
         $wrapper = new Wrapper();
         foreach ($call['params'] as $val) {
-            $pt[] = $wrapper->php_2_xmlrpc_type(gettype($val));
+            $pt[] = $wrapper->php2XmlrpcType(gettype($val));
         }
 
         $result = $server->execute($call['methodName'], $call['params'], $pt);
@@ -984,10 +1002,11 @@ 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();
-            for ($i = 0; $i < $numCalls; $i++) {
-                $call = $calls->arraymem($i);
-                $result[$i] = static::_xmlrpcs_multicall_do_call($server, $call);
+            //$numCalls = $calls->count();
+            //for ($i = 0; $i < $numCalls; $i++) {
+            foreach($calls as $call) {
+                //$call = $calls->arraymem($i);
+                $result[] = static::_xmlrpcs_multicall_do_call($server, $call);
             }
         } else {
             $numCalls = count($req);