| <?php |
|
|
| namespace JsonRPC\Response; |
|
|
| use BadFunctionCallException; |
| use InvalidArgumentException; |
| use Exception; |
| use JsonRPC\Exception\InvalidJsonFormatException; |
| use JsonRPC\Exception\InvalidJsonRpcFormatException; |
| use JsonRPC\Exception\ResponseException; |
| use JsonRPC\Validator\JsonFormatValidator; |
|
|
| |
| |
| |
| |
| |
| |
| class ResponseParser |
| { |
| |
| |
| |
| |
| |
| |
| private $payload; |
|
|
| |
| |
| |
| |
| |
| private $returnException = false; |
|
|
| |
| |
| |
| |
| |
| |
| |
| public static function create() |
| { |
| return new static(); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function withReturnException($returnException) |
| { |
| $this->returnException = $returnException; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function withPayload($payload) |
| { |
| $this->payload = $payload; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function parse() |
| { |
| JsonFormatValidator::validate($this->payload); |
|
|
| if ($this->isBatchResponse()) { |
| $results = array(); |
|
|
| foreach ($this->payload as $response) { |
| $results[] = self::create() |
| ->withReturnException($this->returnException) |
| ->withPayload($response) |
| ->parse(); |
| } |
|
|
| return $results; |
| } |
|
|
| if (isset($this->payload['error']['code'])) { |
| try { |
| $this->handleExceptions(); |
| } catch (Exception $e) { |
| if ($this->returnException) { |
| return $e; |
| } |
| throw $e; |
| } |
| } |
|
|
| return isset($this->payload['result']) ? $this->payload['result'] : null; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| private function handleExceptions() |
| { |
| switch ($this->payload['error']['code']) { |
| case -32700: |
| throw new InvalidJsonFormatException('Parse error: '.$this->payload['error']['message']); |
| case -32600: |
| throw new InvalidJsonRpcFormatException('Invalid Request: '.$this->payload['error']['message']); |
| case -32601: |
| throw new BadFunctionCallException('Procedure not found: '.$this->payload['error']['message']); |
| case -32602: |
| throw new InvalidArgumentException('Invalid arguments: '.$this->payload['error']['message']); |
| default: |
| throw new ResponseException( |
| $this->payload['error']['message'], |
| $this->payload['error']['code'], |
| null, |
| isset($this->payload['error']['data']) ? $this->payload['error']['data'] : null |
| ); |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| private function isBatchResponse() |
| { |
| return array_keys($this->payload) === range(0, count($this->payload) - 1); |
| } |
| } |
|
|