diff options
Diffstat (limited to 'vendor/JsonRPC')
-rw-r--r-- | vendor/JsonRPC/Client.php | 182 | ||||
-rw-r--r-- | vendor/JsonRPC/Server.php | 352 |
2 files changed, 0 insertions, 534 deletions
diff --git a/vendor/JsonRPC/Client.php b/vendor/JsonRPC/Client.php deleted file mode 100644 index d9c785ed..00000000 --- a/vendor/JsonRPC/Client.php +++ /dev/null @@ -1,182 +0,0 @@ -<?php - -namespace JsonRPC; - -use BadFunctionCallException; - -/** - * JsonRPC client class - * - * @package JsonRPC - * @author Frederic Guillot - * @license Unlicense http://unlicense.org/ - */ -class Client -{ - /** - * URL of the server - * - * @access private - * @var string - */ - private $url; - - /** - * HTTP client timeout - * - * @access private - * @var integer - */ - private $timeout; - - /** - * Username for authentication - * - * @access private - * @var string - */ - private $username; - - /** - * Password for authentication - * - * @access private - * @var string - */ - private $password; - - /** - * Enable debug output to the php error log - * - * @access public - * @var boolean - */ - public $debug = false; - - /** - * Default HTTP headers to send to the server - * - * @access private - * @var array - */ - private $headers = array( - 'Connection: close', - 'Content-Type: application/json', - 'Accept: application/json' - ); - - /** - * Constructor - * - * @access public - * @param string $url Server URL - * @param integer $timeout Server URL - * @param array $headers Custom HTTP headers - */ - public function __construct($url, $timeout = 5, $headers = array()) - { - $this->url = $url; - $this->timeout = $timeout; - $this->headers = array_merge($this->headers, $headers); - } - - /** - * Automatic mapping of procedures - * - * @access public - * @param string $method Procedure name - * @param array $params Procedure arguments - * @return mixed - */ - public function __call($method, array $params) - { - // Allow to pass an array and use named arguments - if (count($params) === 1 && is_array($params[0])) { - $params = $params[0]; - } - - return $this->execute($method, $params); - } - - /** - * Set authentication parameters - * - * @access public - * @param string $username Username - * @param string $password Password - */ - public function authentication($username, $password) - { - $this->username = $username; - $this->password = $password; - } - - /** - * Execute - * - * @access public - * @throws BadFunctionCallException Exception thrown when a bad request is made (missing argument/procedure) - * @param string $procedure Procedure name - * @param array $params Procedure arguments - * @return mixed - */ - public function execute($procedure, array $params = array()) - { - $id = mt_rand(); - - $payload = array( - 'jsonrpc' => '2.0', - 'method' => $procedure, - 'id' => $id - ); - - if (! empty($params)) { - $payload['params'] = $params; - } - - $result = $this->doRequest($payload); - - if (isset($result['id']) && $result['id'] == $id && array_key_exists('result', $result)) { - return $result['result']; - } - - throw new BadFunctionCallException('Bad Request'); - } - - /** - * Do the HTTP request - * - * @access public - * @param string $payload Data to send - */ - public function doRequest($payload) - { - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_URL, $this->url); - curl_setopt($ch, CURLOPT_HEADER, false); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->timeout); - curl_setopt($ch, CURLOPT_USERAGENT, 'JSON-RPC PHP Client'); - curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); - curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); - - if ($this->username && $this->password) { - curl_setopt($ch, CURLOPT_USERPWD, $this->username.':'.$this->password); - } - - $result = curl_exec($ch); - $response = json_decode($result, true); - - if ($this->debug) { - error_log('==> Request: '.PHP_EOL.json_encode($payload, JSON_PRETTY_PRINT)); - error_log('==> Response: '.PHP_EOL.json_encode($response, JSON_PRETTY_PRINT)); - } - - curl_close($ch); - - return is_array($response) ? $response : array(); - } -} diff --git a/vendor/JsonRPC/Server.php b/vendor/JsonRPC/Server.php deleted file mode 100644 index 72d4e27e..00000000 --- a/vendor/JsonRPC/Server.php +++ /dev/null @@ -1,352 +0,0 @@ -<?php - -namespace JsonRPC; - -use ReflectionFunction; -use Closure; - -/** - * JsonRPC server class - * - * @package JsonRPC - * @author Frederic Guillot - * @license Unlicense http://unlicense.org/ - */ -class Server -{ - /** - * Data received from the client - * - * @access private - * @var string - */ - private $payload; - - /** - * List of procedures - * - * @static - * @access private - * @var array - */ - static private $procedures = array(); - - /** - * Constructor - * - * @access public - * @param string $payload Client data - */ - public function __construct($payload = '') - { - $this->payload = $payload; - } - - /** - * IP based client restrictions - * - * Return an HTTP error 403 if the client is not allowed - * - * @access public - * @param array $hosts List of hosts - */ - public function allowHosts(array $hosts) { - - if (! in_array($_SERVER['REMOTE_ADDR'], $hosts)) { - - header('Content-Type: application/json'); - header('HTTP/1.0 403 Forbidden'); - echo '["Access Forbidden"]'; - exit; - } - } - - /** - * HTTP Basic authentication - * - * Return an HTTP error 401 if the client is not allowed - * - * @access public - * @param array $users Map of username/password - */ - public function authentication(array $users) - { - // OVH workaround - if (isset($_SERVER['REMOTE_USER'])) { - list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['REMOTE_USER'], 6))); - } - - if (! isset($_SERVER['PHP_AUTH_USER']) || - ! isset($users[$_SERVER['PHP_AUTH_USER']]) || - $users[$_SERVER['PHP_AUTH_USER']] !== $_SERVER['PHP_AUTH_PW']) { - - header('WWW-Authenticate: Basic realm="JsonRPC"'); - header('Content-Type: application/json'); - header('HTTP/1.0 401 Unauthorized'); - echo '["Authentication failed"]'; - exit; - } - } - - /** - * Register a new procedure - * - * @access public - * @param string $name Procedure name - * @param closure $callback Callback - */ - public function register($name, Closure $callback) - { - self::$procedures[$name] = $callback; - } - - /** - * Unregister a procedure - * - * @access public - * @param string $name Procedure name - */ - public function unregister($name) - { - if (isset(self::$procedures[$name])) { - unset(self::$procedures[$name]); - } - } - - /** - * Unregister all procedures - * - * @access public - */ - public function unregisterAll() - { - self::$procedures = array(); - } - - /** - * Return the response to the client - * - * @access public - * @param array $data Data to send to the client - * @param array $payload Incoming data - * @return string - */ - public function getResponse(array $data, array $payload = array()) - { - if (! array_key_exists('id', $payload)) { - return ''; - } - - $response = array( - 'jsonrpc' => '2.0', - 'id' => $payload['id'] - ); - - $response = array_merge($response, $data); - - @header('Content-Type: application/json'); - return json_encode($response); - } - - /** - * Map arguments to the procedure - * - * @access public - * @param array $request_params Incoming arguments - * @param array $method_params Procedure arguments - * @param array $params Arguments to pass to the callback - * @param integer $nb_required_params Number of required parameters - * @return bool - */ - public function mapParameters(array $request_params, array $method_params, array &$params, $nb_required_params) - { - if (count($request_params) < $nb_required_params) { - return false; - } - - // Positional parameters - if (array_keys($request_params) === range(0, count($request_params) - 1)) { - $params = $request_params; - return true; - } - - // Named parameters - foreach ($method_params as $p) { - - $name = $p->getName(); - - if (isset($request_params[$name])) { - $params[$name] = $request_params[$name]; - } - else if ($p->isDefaultValueAvailable()) { - $params[$name] = $p->getDefaultValue(); - } - else { - return false; - } - } - - return true; - } - - /** - * Parse the payload and test if the parsed JSON is ok - * - * @access public - * @return boolean - */ - public function isValidJsonFormat() - { - if (empty($this->payload)) { - $this->payload = file_get_contents('php://input'); - } - - if (is_string($this->payload)) { - $this->payload = json_decode($this->payload, true); - } - - return is_array($this->payload); - } - - /** - * Test if all required JSON-RPC parameters are here - * - * @access public - * @return boolean - */ - public function isValidJsonRpcFormat() - { - if (! isset($this->payload['jsonrpc']) || - ! isset($this->payload['method']) || - ! is_string($this->payload['method']) || - $this->payload['jsonrpc'] !== '2.0' || - (isset($this->payload['params']) && ! is_array($this->payload['params']))) { - - return false; - } - - return true; - } - - /** - * Return true if we have a batch request - * - * @access public - * @return boolean - */ - private function isBatchRequest() - { - return array_keys($this->payload) === range(0, count($this->payload) - 1); - } - - /** - * Handle batch request - * - * @access private - * @return string - */ - private function handleBatchRequest() - { - $responses = array(); - - foreach ($this->payload as $payload) { - - if (! is_array($payload)) { - - $responses[] = $this->getResponse(array( - 'error' => array( - 'code' => -32600, - 'message' => 'Invalid Request' - )), - array('id' => null) - ); - } - else { - - $server = new Server($payload); - $response = $server->execute(); - - if ($response) { - $responses[] = $response; - } - } - } - - return empty($responses) ? '' : '['.implode(',', $responses).']'; - } - - /** - * Parse incoming requests - * - * @access public - * @return string - */ - public function execute() - { - // Invalid Json - if (! $this->isValidJsonFormat()) { - return $this->getResponse(array( - 'error' => array( - 'code' => -32700, - 'message' => 'Parse error' - )), - array('id' => null) - ); - } - - // Handle batch request - if ($this->isBatchRequest()){ - return $this->handleBatchRequest(); - } - - // Invalid JSON-RPC format - if (! $this->isValidJsonRpcFormat()) { - - return $this->getResponse(array( - 'error' => array( - 'code' => -32600, - 'message' => 'Invalid Request' - )), - array('id' => null) - ); - } - - // Procedure not found - if (! isset(self::$procedures[$this->payload['method']])) { - - return $this->getResponse(array( - 'error' => array( - 'code' => -32601, - 'message' => 'Method not found' - )), - $this->payload - ); - } - - // Execute the procedure - $callback = self::$procedures[$this->payload['method']]; - $params = array(); - - $reflection = new ReflectionFunction($callback); - - if (isset($this->payload['params'])) { - - $parameters = $reflection->getParameters(); - - if (! $this->mapParameters($this->payload['params'], $parameters, $params, $reflection->getNumberOfRequiredParameters())) { - - return $this->getResponse(array( - 'error' => array( - 'code' => -32602, - 'message' => 'Invalid params' - )), - $this->payload - ); - } - } - - $result = $reflection->invokeArgs($params); - - return $this->getResponse(array('result' => $result), $this->payload); - } -} |