|
<?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); |
|
} |
|
} |
|
|