diff --git a/src/Server/Helper.php b/src/Server/Helper.php index 3278b1b8d..8105bbb0a 100644 --- a/src/Server/Helper.php +++ b/src/Server/Helper.php @@ -525,11 +525,11 @@ public function parsePsrRequest(RequestInterface $request) $this->assertJsonObjectOrArray($bodyParams); } else { - parse_str((string) $request->getBody(), $bodyParams); - - if (! is_array($bodyParams)) { - throw new RequestError('Unexpected content type: ' . Utils::printSafeJson($contentType[0])); + if ($request instanceof ServerRequestInterface) { + $bodyParams = $request->getParsedBody(); } + + $bodyParams ??= $this->decodeContent((string) $request->getBody(), $contentType[0]); } } @@ -558,6 +558,22 @@ protected function decodeJson(string $rawBody) return $bodyParams; } + /** + * @return array + * + * @throws RequestError + */ + protected function decodeContent(string $rawBody, string $contentType): array + { + parse_str($rawBody, $bodyParams); + + if (! is_array($bodyParams)) { + throw new RequestError('Unexpected content type: ' . Utils::printSafeJson($contentType)); + } + + return $bodyParams; + } + /** * @param mixed $bodyParams * diff --git a/tests/Server/RequestParsingTest.php b/tests/Server/RequestParsingTest.php index c5592fc00..914f3749e 100644 --- a/tests/Server/RequestParsingTest.php +++ b/tests/Server/RequestParsingTest.php @@ -10,6 +10,7 @@ use GraphQL\Server\RequestError; use InvalidArgumentException; use Nyholm\Psr7\Request; +use Nyholm\Psr7\ServerRequest; use Nyholm\Psr7\Stream; use Nyholm\Psr7\Uri; use PHPUnit\Framework\TestCase; @@ -110,6 +111,8 @@ public function testParsesUrlencodedRequest(): void $parsed = [ 'raw' => $this->parseRawFormUrlencodedRequest($post), 'psr' => $this->parsePsrFormUrlEncodedRequest($post), + 'serverRequest' => $this->parsePsrFormUrlEncodedServerRequest($post, false), + 'parsedServerRequest' => $this->parsePsrFormUrlEncodedServerRequest($post, true), ]; foreach ($parsed as $method => $parsedBody) { @@ -155,6 +158,24 @@ private function parsePsrFormUrlEncodedRequest($postValue) ); } + private function parsePsrFormUrlEncodedServerRequest($postValue, bool $parsed) + { + $helper = new Helper(); + + $request = new ServerRequest( + 'POST', + '', + ['Content-Type' => 'application/x-www-form-urlencoded'], + $parsed ? null : http_build_query($postValue), + ); + + if ($parsed) { + $request = $request->withParsedBody($postValue); + } + + return $helper->parsePsrRequest($request); + } + public function testParsesGetRequest(): void { $query = '{my query}';