Example #1
0
    /**
     * setParams()/getParams() test
     */
    public function testSetParams()
    {
        $params = array(
            'string1',
            true,
            array('one', 'two')
        );
        $this->_request->setParams($params);
        $returned = $this->_request->getParams();
        $this->assertSame($params, $returned);

        $params = array(
            'string2',
            array('two', 'one')
        );
        $this->_request->setParams($params);
        $returned = $this->_request->getParams();
        $this->assertSame($params, $returned);

        $params = array(array('value' => 'foobar'));
        $this->_request->setParams($params);
        $this->assertSame(array('foobar'), $this->_request->getParams());
        $this->assertSame(array('string'), $this->_request->getTypes());

        $null = new Value\Nil();
        $this->_request->setParams('foo', 1, $null);
        $this->assertSame(array('foo', 1, $null), $this->_request->getParams());
        $this->assertSame(array('string', 'int', 'nil'), $this->_request->getTypes());

        $this->assertNull($this->_request->setParams(), 'Call without argument returns null');
    }
Example #2
0
    /**
     * Handle an xmlrpc call (actual work)
     *
     * @param Zend_XmlRpc_Request $request
     * @return Zend_XmlRpc_Response
     * @throws Zend_XmlRpcServer_Exception|Exception
     * Zend_XmlRpcServer_Exceptions are thrown for internal errors; otherwise,
     * any other exception may be thrown by the callback
     */
    protected function _handle(Zend_XmlRpc_Request $request)
    {
        $method = $request->getMethod();

        // Check for valid method
        if (!$this->_table->hasMethod($method)) {
            require_once 'Zend/XmlRpc/Server/Exception.php';
            throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620);
        }

        $info     = $this->_table->getMethod($method);
        $params   = $request->getParams();
        $argv     = $info->getInvokeArguments();
        if (0 < count($argv) and $this->sendArgumentsToAllMethods()) {
            $params = array_merge($params, $argv);
        }

        // Check calling parameters against signatures
        $matched    = false;
        $sigCalled  = $request->getTypes();

        $sigLength  = count($sigCalled);
        $paramsLen  = count($params);
        if ($sigLength < $paramsLen) {
            for ($i = $sigLength; $i < $paramsLen; ++$i) {
                $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($params[$i]);
                $sigCalled[] = $xmlRpcValue->getType();
            }
        }

        $signatures = $info->getPrototypes();
        foreach ($signatures as $signature) {
            $sigParams = $signature->getParameters();
            if ($sigCalled === $sigParams) {
                $matched = true;
                break;
            }
        }
        if (!$matched) {
            require_once 'Zend/XmlRpc/Server/Exception.php';
            throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623);
        }

        $return        = $this->_dispatch($info, $params);
        $responseClass = $this->getResponseClass();
        return new $responseClass($return);
    }
Example #3
0
 /**
  * Handle an xmlrpc call (actual work)
  *
  * @param Zend_XmlRpc_Request $request
  * @return Zend_XmlRpc_Response
  * @throws Zend_XmlRpcServer_Exception|Exception
  * Zend_XmlRpcServer_Exceptions are thrown for internal errors; otherwise,
  * any other exception may be thrown by the callback
  */
 protected function _handle(Zend_XmlRpc_Request $request)
 {
     $method = $request->getMethod();
     // Check for valid method
     if (!isset($this->_table[$method])) {
         throw new Zend_XmlRpc_Server_Exception('Method "' . $method . '" does not exist', 620);
     }
     $info = $this->_table[$method];
     $params = $request->getParams();
     $argv = $info->getInvokeArguments();
     if (0 < count($argv)) {
         $params = array_merge($params, $argv);
     }
     // Check calling parameters against signatures
     $matched = false;
     $sigCalled = $request->getTypes();
     $sigLength = count($sigCalled);
     $paramsLen = count($params);
     if ($sigLength < $paramsLen) {
         for ($i = $sigLength; $i < $paramsLen; ++$i) {
             $xmlRpcValue = Zend_XmlRpc_Value::getXmlRpcValue($params[$i]);
             $sigCalled[] = $xmlRpcValue->getType();
         }
     }
     $signatures = $info->getPrototypes();
     foreach ($signatures as $signature) {
         $sigParams = $signature->getParameters();
         $tmpParams = array();
         foreach ($sigParams as $param) {
             $tmpParams[] = $param->getType();
         }
         if ($sigCalled === $tmpParams) {
             $matched = true;
             break;
         }
     }
     if (!$matched) {
         throw new Zend_XmlRpc_Server_Exception('Calling parameters do not match signature', 623);
     }
     if ($info instanceof Zend_Server_Reflection_Function) {
         $func = $info->getName();
         $return = call_user_func_array($func, $params);
     } elseif ($info instanceof Zend_Server_Reflection_Method && $info->system) {
         // System methods
         $return = $info->invokeArgs($this, $params);
     } elseif ($info instanceof Zend_Server_Reflection_Method) {
         // Get class
         $class = $info->getDeclaringClass()->getName();
         if ('static' == $info->isStatic()) {
             // for some reason, invokeArgs() does not work the same as
             // invoke(), and expects the first argument to be an object.
             // So, using a callback if the method is static.
             $return = call_user_func_array(array($class, $info->getName()), $params);
         } else {
             // Object methods
             try {
                 $object = $info->getDeclaringClass()->newInstance();
             } catch (Exception $e) {
                 throw new Zend_XmlRpc_Server_Exception('Error instantiating class ' . $class . ' to invoke method ' . $info->getName(), 621);
             }
             $return = $info->invokeArgs($object, $params);
         }
     } else {
         throw new Zend_XmlRpc_Server_Exception('Method missing implementation ' . get_class($info), 622);
     }
     $response = new ReflectionClass($this->_responseClass);
     return $response->newInstance($return);
 }