fix: allow epivals in mixed-calling-convention servers
authorgggeek <giunta.gaetano@gmail.com>
Mon, 4 Jan 2021 22:51:27 +0000 (22:51 +0000)
committergggeek <giunta.gaetano@gmail.com>
Mon, 4 Jan 2021 22:51:27 +0000 (22:51 +0000)
src/Server.php

index 5b77ad4..d5134ba 100644 (file)
@@ -11,11 +11,6 @@ use PhpXmlRpc\Helper\XMLParser;
  */
 class Server
 {
-    /**
-     * Array defining php functions exposed as xmlrpc methods by this server.
-     */
-    protected $dmap = array();
-
     /**
      * Defines how functions in dmap will be invoked: either using an xmlrpc request object
      * or plain php values.
@@ -81,21 +76,34 @@ class Server
     public $response_charset_encoding = '';
 
     /**
-     * Storage for internal debug info.
+     * Extra data passed at runtime to method handling functions. Used only by EPI layer
      */
-    protected $debug_info = '';
+    public $user_data = null;
 
     /**
-     * Extra data passed at runtime to method handling functions. Used only by EPI layer
+     * Array defining php functions exposed as xmlrpc methods by this server.
+     * @var array[] $dmap
      */
-    public $user_data = null;
+    protected $dmap = array();
+
+    /**
+     * Storage for internal debug info.
+     */
+    protected $debug_info = '';
 
     protected static $_xmlrpc_debuginfo = '';
     protected static $_xmlrpcs_occurred_errors = '';
     protected static $_xmlrpcs_prev_ehandler = '';
 
     /**
-     * @param array $dispatchMap the dispatch map with definition of exposed services
+     * @param array[] $dispatchMap the dispatch map with definition of exposed services
+     *                             Array keys are the names of the method names.
+     *                             Each array value is an array with the following members:
+     *                             - function (callable)
+     *                             - docstring (optional)
+     *                             - signature (array, optional)
+     *                             - signature_docs (array, optional)
+     *                             - parameters_type (string, optional)
      * @param boolean $serviceNow set to false to prevent the server from running upon construction
      */
     public function __construct($dispatchMap = null, $serviceNow = true)
@@ -156,6 +164,10 @@ class Server
     }
 
     /**
+     * Add a string to the debug info that will be later serialized by the server as part of the response message
+     * (base64 encoded, only when debug level >= 2)
+     *
+     * character set.
      * @param string $msg
      */
     public static function error_occurred($msg)
@@ -256,6 +268,7 @@ class Server
             // http compression of output: only
             // if we can do it, and we want to do it, and client asked us to,
             // and php ini settings do not force it already
+            /// @todo check separately for gzencode and gzcompress functions, in case of polyfills
             $phpNoSelfCompress = !ini_get('zlib.output_compression') && (ini_get('output_handler') != 'ob_gzhandler');
             if ($this->compress_response && function_exists('gzencode') && $respEncoding != ''
                 && $phpNoSelfCompress
@@ -293,11 +306,15 @@ class Server
      *
      * @param string $methodName the name with which the method will be made available
      * @param callable $function the php function that will get invoked
-     * @param array $sig the array of valid method signatures
+     * @param array[] $sig the array of valid method signatures.
+     *                     Each element is one signature: an array of strings with at least one element
+     *                     First element = type of returned value. Elements 2..N = types of parameters 1..N
      * @param string $doc method documentation
-     * @param array $sigDoc the array of valid method signatures docs (one string per param, one for return type)
+     * @param array[] $sigDoc the array of valid method signatures docs, following the format of $sig but with
+     *                        descriptions instead of types (one string for return type, one per param)
      *
      * @todo raise a warning if the user tries to register a 'system.' method
+     * @todo allow setting parameters_type
      */
     public function add_to_map($methodName, $function, $sig = null, $doc = false, $sigDoc = false)
     {
@@ -472,6 +489,9 @@ class Server
      * @return Response
      *
      * @throws \Exception in case the executed method does throw an exception (and depending on server configuration)
+     *
+     * @internal this function will become protected in the future
+     * @todo either rename this function or move the 'execute' part out of it...
      */
     public function parseRequest($data, $reqEncoding = '')
     {
@@ -528,7 +548,7 @@ class Server
             // registered as phpvals) that would mean a useless encode+decode pass
             if ($this->functions_parameters_type != 'xmlrpcvals' ||
                 (isset($this->dmap[$xmlRpcParser->_xh['method']]['parameters_type']) &&
-                    ($this->dmap[$xmlRpcParser->_xh['method']]['parameters_type'] == 'phpvals')
+                    ($this->dmap[$xmlRpcParser->_xh['method']]['parameters_type'] != 'xmlrpcvals')
                 )
             ) {
                 if ($this->debug > 1) {
@@ -556,9 +576,9 @@ class Server
     /**
      * Execute a method invoked by the client, checking parameters used.
      *
-     * @param mixed $req either a Request obj or a method name
-     * @param array $params array with method parameters as php types (if m is method name only)
-     * @param array $paramTypes array with xmlrpc types of method parameters (if m is method name only)
+     * @param Request|string $req either a Request obj or a method name
+     * @param mixed[] $params array with method parameters as php types (only if m is method name)
+     * @param string[] $paramTypes array with xmlrpc types of method parameters (only if m is method name)
      *
      * @return Response
      *