summaryrefslogtreecommitdiff
path: root/vendor/fguillot/json-rpc/src/JsonRPC/Server.php
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2017-10-25 16:22:10 -0700
committerFrederic Guillot <fred@kanboard.net>2017-10-25 16:22:10 -0700
commit9e2b2a32fd0e967ad3184e9a5d091a29953acb91 (patch)
tree00822e24aa1110c73ca455a8d096ef296c008cbc /vendor/fguillot/json-rpc/src/JsonRPC/Server.php
parentc507c5416251c505cb3e088a03c6664bed73c812 (diff)
Include composer dependencies in repo
Diffstat (limited to 'vendor/fguillot/json-rpc/src/JsonRPC/Server.php')
-rw-r--r--vendor/fguillot/json-rpc/src/JsonRPC/Server.php386
1 files changed, 386 insertions, 0 deletions
diff --git a/vendor/fguillot/json-rpc/src/JsonRPC/Server.php b/vendor/fguillot/json-rpc/src/JsonRPC/Server.php
new file mode 100644
index 00000000..1ed075a4
--- /dev/null
+++ b/vendor/fguillot/json-rpc/src/JsonRPC/Server.php
@@ -0,0 +1,386 @@
+<?php
+
+namespace JsonRPC;
+
+use Closure;
+use Exception;
+use JsonRPC\Request\BatchRequestParser;
+use JsonRPC\Request\RequestParser;
+use JsonRPC\Response\ResponseBuilder;
+use JsonRPC\Validator\HostValidator;
+use JsonRPC\Validator\JsonFormatValidator;
+use JsonRPC\Validator\UserValidator;
+
+/**
+ * JsonRPC server class
+ *
+ * @package JsonRPC
+ * @author Frederic Guillot
+ */
+class Server
+{
+ /**
+ * Allowed hosts
+ *
+ * @access protected
+ * @var array
+ */
+ protected $hosts = array();
+
+ /**
+ * Data received from the client
+ *
+ * @access protected
+ * @var array
+ */
+ protected $payload = array();
+
+ /**
+ * List of exceptions that should not be relayed to the client
+ *
+ * @access protected
+ * @var array()
+ */
+ protected $localExceptions = array();
+
+ /**
+ * Username
+ *
+ * @access protected
+ * @var string
+ */
+ protected $username = '';
+
+ /**
+ * Password
+ *
+ * @access protected
+ * @var string
+ */
+ protected $password = '';
+
+ /**
+ * Allowed users
+ *
+ * @access protected
+ * @var array
+ */
+ protected $users = array();
+
+ /**
+ * $_SERVER
+ *
+ * @access protected
+ * @var array
+ */
+ protected $serverVariable;
+
+ /**
+ * ProcedureHandler object
+ *
+ * @access protected
+ * @var ProcedureHandler
+ */
+ protected $procedureHandler;
+
+ /**
+ * MiddlewareHandler object
+ *
+ * @access protected
+ * @var MiddlewareHandler
+ */
+ protected $middlewareHandler;
+
+ /**
+ * Response builder
+ *
+ * @access protected
+ * @var ResponseBuilder
+ */
+ protected $responseBuilder;
+
+ /**
+ * Response builder
+ *
+ * @access protected
+ * @var RequestParser
+ */
+ protected $requestParser;
+
+ /**
+ *
+ * Batch request parser
+ *
+ * @access protected
+ * @var BatchRequestParser
+ */
+ protected $batchRequestParser;
+
+ /**
+ * Constructor
+ *
+ * @access public
+ * @param string $request
+ * @param array $server
+ * @param ResponseBuilder $responseBuilder
+ * @param RequestParser $requestParser
+ * @param BatchRequestParser $batchRequestParser
+ * @param ProcedureHandler $procedureHandler
+ * @param MiddlewareHandler $middlewareHandler
+ */
+ public function __construct(
+ $request = '',
+ array $server = array(),
+ ResponseBuilder $responseBuilder = null,
+ RequestParser $requestParser = null,
+ BatchRequestParser $batchRequestParser = null,
+ ProcedureHandler $procedureHandler = null,
+ MiddlewareHandler $middlewareHandler = null
+ ) {
+ if ($request !== '') {
+ $this->payload = json_decode($request, true);
+ } else {
+ $this->payload = json_decode(file_get_contents('php://input'), true);
+ }
+
+ $this->serverVariable = $server ?: $_SERVER;
+ $this->responseBuilder = $responseBuilder ?: ResponseBuilder::create();
+ $this->requestParser = $requestParser ?: RequestParser::create();
+ $this->batchRequestParser = $batchRequestParser ?: BatchRequestParser::create();
+ $this->procedureHandler = $procedureHandler ?: new ProcedureHandler();
+ $this->middlewareHandler = $middlewareHandler ?: new MiddlewareHandler();
+ }
+
+ /**
+ * Define alternative authentication header
+ *
+ * @access public
+ * @param string $header Header name
+ * @return $this
+ */
+ public function setAuthenticationHeader($header)
+ {
+ if (! empty($header)) {
+ $header = 'HTTP_'.str_replace('-', '_', strtoupper($header));
+ $value = $this->getServerVariable($header);
+
+ if (! empty($value)) {
+ list($this->username, $this->password) = explode(':', base64_decode($value));
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Get ProcedureHandler
+ *
+ * @access public
+ * @return ProcedureHandler
+ */
+ public function getProcedureHandler()
+ {
+ return $this->procedureHandler;
+ }
+
+ /**
+ * Get MiddlewareHandler
+ *
+ * @access public
+ * @return MiddlewareHandler
+ */
+ public function getMiddlewareHandler()
+ {
+ return $this->middlewareHandler;
+ }
+
+ /**
+ * Get username
+ *
+ * @access public
+ * @return string
+ */
+ public function getUsername()
+ {
+ return $this->username ?: $this->getServerVariable('PHP_AUTH_USER');
+ }
+
+ /**
+ * Get password
+ *
+ * @access public
+ * @return string
+ */
+ public function getPassword()
+ {
+ return $this->password ?: $this->getServerVariable('PHP_AUTH_PW');
+ }
+
+ /**
+ * IP based client restrictions
+ *
+ * @access public
+ * @param array $hosts List of hosts
+ * @return $this
+ */
+ public function allowHosts(array $hosts)
+ {
+ $this->hosts = $hosts;
+ return $this;
+ }
+
+ /**
+ * HTTP Basic authentication
+ *
+ * @access public
+ * @param array $users Dictionary of username/password
+ * @return $this
+ */
+ public function authentication(array $users)
+ {
+ $this->users = $users;
+ return $this;
+ }
+
+ /**
+ * Register a new procedure
+ *
+ * @access public
+ * @deprecated Use $server->getProcedureHandler()->withCallback($procedure, $callback)
+ * @param string $procedure Procedure name
+ * @param closure $callback Callback
+ * @return $this
+ */
+ public function register($procedure, Closure $callback)
+ {
+ $this->procedureHandler->withCallback($procedure, $callback);
+ return $this;
+ }
+
+ /**
+ * Bind a procedure to a class
+ *
+ * @access public
+ * @deprecated Use $server->getProcedureHandler()->withClassAndMethod($procedure, $class, $method);
+ * @param string $procedure Procedure name
+ * @param mixed $class Class name or instance
+ * @param string $method Procedure name
+ * @return $this
+ */
+ public function bind($procedure, $class, $method = '')
+ {
+ $this->procedureHandler->withClassAndMethod($procedure, $class, $method);
+ return $this;
+ }
+
+ /**
+ * Bind a class instance
+ *
+ * @access public
+ * @deprecated Use $server->getProcedureHandler()->withObject($instance);
+ * @param mixed $instance Instance name
+ * @return $this
+ */
+ public function attach($instance)
+ {
+ $this->procedureHandler->withObject($instance);
+ return $this;
+ }
+
+ /**
+ * Exception classes that should not be relayed to the client
+ *
+ * @access public
+ * @param Exception|string $exception
+ * @return $this
+ */
+ public function withLocalException($exception)
+ {
+ $this->localExceptions[] = $exception;
+ return $this;
+ }
+
+ /**
+ * Parse incoming requests
+ *
+ * @access public
+ * @return string
+ */
+ public function execute()
+ {
+ try {
+ JsonFormatValidator::validate($this->payload);
+ HostValidator::validate($this->hosts, $this->getServerVariable('REMOTE_ADDR'));
+ UserValidator::validate($this->users, $this->getUsername(), $this->getPassword());
+
+ $this->middlewareHandler
+ ->withUsername($this->getUsername())
+ ->withPassword($this->getPassword())
+ ;
+
+ $response = $this->parseRequest();
+
+ } catch (Exception $e) {
+ $response = $this->handleExceptions($e);
+ }
+
+ $this->responseBuilder->sendHeaders();
+ return $response;
+ }
+
+ /**
+ * Handle exceptions
+ *
+ * @access protected
+ * @param Exception $e
+ * @return string
+ * @throws Exception
+ */
+ protected function handleExceptions(Exception $e)
+ {
+ foreach ($this->localExceptions as $exception) {
+ if ($e instanceof $exception) {
+ throw $e;
+ }
+ }
+
+ return $this->responseBuilder->withException($e)->build();
+ }
+
+ /**
+ * Parse incoming request
+ *
+ * @access protected
+ * @return string
+ */
+ protected function parseRequest()
+ {
+ if (BatchRequestParser::isBatchRequest($this->payload)) {
+ return $this->batchRequestParser
+ ->withPayload($this->payload)
+ ->withProcedureHandler($this->procedureHandler)
+ ->withMiddlewareHandler($this->middlewareHandler)
+ ->withLocalException($this->localExceptions)
+ ->parse();
+ }
+
+ return $this->requestParser
+ ->withPayload($this->payload)
+ ->withProcedureHandler($this->procedureHandler)
+ ->withMiddlewareHandler($this->middlewareHandler)
+ ->withLocalException($this->localExceptions)
+ ->parse();
+ }
+
+ /**
+ * Check existence and get value of server variable
+ *
+ * @access protected
+ * @param string $variable
+ * @return string|null
+ */
+ protected function getServerVariable($variable)
+ {
+ return isset($this->serverVariable[$variable]) ? $this->serverVariable[$variable] : null;
+ }
+}