diff --git a/src/helpers/RequestParser.php b/src/helpers/RequestParser.php index 5209fda..6e6a278 100644 --- a/src/helpers/RequestParser.php +++ b/src/helpers/RequestParser.php @@ -3,6 +3,7 @@ namespace alsvanzelf\jsonapi\helpers; use alsvanzelf\jsonapi\Document; +use alsvanzelf\jsonapi\exceptions\Exception; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; @@ -44,6 +45,8 @@ public function __construct($selfLink='', array $queryParameters=[], array $docu /** * @return self + * + * @throws Exception if the body's json is invalid */ public static function fromSuperglobals() { $selfLink = ''; @@ -60,6 +63,9 @@ public static function fromSuperglobals() { if ($documentIsJsonapi || $documentIsJson) { $document = json_decode(file_get_contents('php://input'), true); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('error parsing request body: '.json_last_error_msg()); + } if ($document === null) { $document = []; @@ -73,6 +79,8 @@ public static function fromSuperglobals() { /** * @param ServerRequestInterface|RequestInterface $request * @return self + * + * @throws Exception if the body's json is invalid */ public static function fromPsrRequest(RequestInterface $request) { $selfLink = (string) $request->getUri(); @@ -90,9 +98,8 @@ public static function fromPsrRequest(RequestInterface $request) { } else { $document = json_decode($request->getBody()->getContents(), true); - - if ($document === null) { - $document = []; + if (json_last_error() !== JSON_ERROR_NONE) { + throw new Exception('error parsing request body: '.json_last_error_msg()); } } diff --git a/tests/helpers/RequestParserTest.php b/tests/helpers/RequestParserTest.php index fd17061..b7f1b0a 100644 --- a/tests/helpers/RequestParserTest.php +++ b/tests/helpers/RequestParserTest.php @@ -3,6 +3,7 @@ namespace alsvanzelf\jsonapiTests\helpers; use alsvanzelf\jsonapi\Document; +use alsvanzelf\jsonapi\exceptions\Exception; use alsvanzelf\jsonapi\helpers\RequestParser; use alsvanzelf\jsonapiTests\helpers\TestableNonInterfaceRequestInterface; use alsvanzelf\jsonapiTests\helpers\TestableNonInterfaceServerRequestInterface; @@ -178,6 +179,18 @@ public function testFromPsrRequest_WithEmptyDocument() { $this->assertSame([], $requestParser->getDocument()); } + public function testFromPsrRequest_WithBrokenDocument() { + $selfLink = ''; + $queryParameters = []; + $document = '{"data": {foo: "bar"}}'; + $request = new TestableNonInterfaceRequestInterface($selfLink, $queryParameters, $document); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('error parsing request body: '); + + RequestParser::fromPsrRequest($request); + } + public function testFromPsrRequest_WithServerRequestInterface() { $queryParameters = [ 'sort' => 'name,-location', diff --git a/tests/helpers/TestableNonInterfaceStreamInterface.php b/tests/helpers/TestableNonInterfaceStreamInterface.php index d573988..87a1d25 100644 --- a/tests/helpers/TestableNonInterfaceStreamInterface.php +++ b/tests/helpers/TestableNonInterfaceStreamInterface.php @@ -19,8 +19,11 @@ public function getContents() { if ($this->document === null) { return ''; } + if (is_string($this->document) === false) { + return (string) json_encode($this->document); + } - return (string) json_encode($this->document); + return $this->document; } // not used in current implementation