summaryrefslogtreecommitdiff
path: root/vendor/JsonRPC
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/JsonRPC')
-rw-r--r--vendor/JsonRPC/Client.php20
-rw-r--r--vendor/JsonRPC/Server.php137
2 files changed, 112 insertions, 45 deletions
diff --git a/vendor/JsonRPC/Client.php b/vendor/JsonRPC/Client.php
index dda78094..65aed223 100644
--- a/vendor/JsonRPC/Client.php
+++ b/vendor/JsonRPC/Client.php
@@ -2,11 +2,13 @@
namespace JsonRPC;
+use BadFunctionCallException;
+
/**
* JsonRPC client class
*
* @package JsonRPC
- * @author Frderic Guillot
+ * @author Frederic Guillot
* @license Unlicense http://unlicense.org/
*/
class Client
@@ -44,6 +46,14 @@ class Client
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
@@ -100,6 +110,7 @@ class Client
* 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
@@ -124,7 +135,7 @@ class Client
return $result['result'];
}
- return null;
+ throw new BadFunctionCallException('Bad Request');
}
/**
@@ -154,6 +165,11 @@ class Client
$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
index f80531fd..72d4e27e 100644
--- a/vendor/JsonRPC/Server.php
+++ b/vendor/JsonRPC/Server.php
@@ -9,7 +9,7 @@ use Closure;
* JsonRPC server class
*
* @package JsonRPC
- * @author Frderic Guillot
+ * @author Frederic Guillot
* @license Unlicense http://unlicense.org/
*/
class Server
@@ -155,16 +155,18 @@ class Server
* @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)
+ 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)) {
-
- if (count($request_params) !== count($method_params)) return false;
$params = $request_params;
-
return true;
}
@@ -188,14 +190,13 @@ class Server
}
/**
- * Parse incoming requests
+ * Parse the payload and test if the parsed JSON is ok
*
* @access public
- * @return string
+ * @return boolean
*/
- public function execute()
+ public function isValidJsonFormat()
{
- // Parse payload
if (empty($this->payload)) {
$this->payload = file_get_contents('php://input');
}
@@ -204,53 +205,102 @@ class Server
$this->payload = json_decode($this->payload, true);
}
- // Check JSON format
- if (! is_array($this->payload)) {
+ return is_array($this->payload);
+ }
- return $this->getResponse(array(
- 'error' => array(
- 'code' => -32700,
- 'message' => 'Parse error'
- )),
- array('id' => null)
- );
+ /**
+ * 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;
}
- // Handle batch request
- if (array_keys($this->payload) === range(0, count($this->payload) - 1)) {
+ return true;
+ }
- $responses = array();
+ /**
+ * 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) {
+ foreach ($this->payload as $payload) {
- if (! is_array($payload)) {
+ if (! is_array($payload)) {
- $responses[] = $this->getResponse(array(
- 'error' => array(
- 'code' => -32600,
- 'message' => 'Invalid Request'
- )),
- array('id' => null)
- );
- }
- else {
+ $responses[] = $this->getResponse(array(
+ 'error' => array(
+ 'code' => -32600,
+ 'message' => 'Invalid Request'
+ )),
+ array('id' => null)
+ );
+ }
+ else {
- $server = new Server($payload);
- $response = $server->execute();
+ $server = new Server($payload);
+ $response = $server->execute();
- if ($response) $responses[] = $response;
+ if ($response) {
+ $responses[] = $response;
}
}
+ }
- return empty($responses) ? '' : '['.implode(',', $responses).']';
+ 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)
+ );
}
- // Check JSON-RPC format
- 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']))) {
+ // Handle batch request
+ if ($this->isBatchRequest()){
+ return $this->handleBatchRequest();
+ }
+
+ // Invalid JSON-RPC format
+ if (! $this->isValidJsonRpcFormat()) {
return $this->getResponse(array(
'error' => array(
@@ -273,6 +323,7 @@ class Server
);
}
+ // Execute the procedure
$callback = self::$procedures[$this->payload['method']];
$params = array();
@@ -282,7 +333,7 @@ class Server
$parameters = $reflection->getParameters();
- if (! $this->mapParameters($this->payload['params'], $parameters, $params)) {
+ if (! $this->mapParameters($this->payload['params'], $parameters, $params, $reflection->getNumberOfRequiredParameters())) {
return $this->getResponse(array(
'error' => array(