From 7af87335260dde9aa01b1f913f18ce43b82080dd Mon Sep 17 00:00:00 2001 From: Tim MacDonald Date: Tue, 21 Nov 2023 02:34:03 +1100 Subject: [PATCH] Handle string based payloads (#49047) --- src/Illuminate/Routing/RoutingServiceProvider.php | 12 +++++++++--- .../Integration/Foundation/Fixtures/laravel.txt.gz | Bin 0 -> 40 bytes .../Foundation/RoutingServiceProviderTest.php | 12 ++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/Integration/Foundation/Fixtures/laravel.txt.gz diff --git a/src/Illuminate/Routing/RoutingServiceProvider.php b/src/Illuminate/Routing/RoutingServiceProvider.php index a2ca675da4e2..547e195e3866 100755 --- a/src/Illuminate/Routing/RoutingServiceProvider.php +++ b/src/Illuminate/Routing/RoutingServiceProvider.php @@ -138,9 +138,15 @@ protected function registerPsrRequest() $psr17Factory = new Psr17Factory; return with((new PsrHttpFactory($psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory)) - ->createRequest($illuminateRequest = $app->make('request')), fn ($request) => $request->withParsedBody( - array_merge($request->getParsedBody() ?? [], $illuminateRequest->getPayload()->all()) - )); + ->createRequest($illuminateRequest = $app->make('request')), function (ServerRequestInterface $request) use ($illuminateRequest) { + if ($illuminateRequest->getContentTypeFormat() !== 'json' && $illuminateRequest->request->count() === 0) { + return $request; + } + + return $request->withParsedBody( + array_merge($request->getParsedBody() ?? [], $illuminateRequest->getPayload()->all()) + ); + }); } throw new BindingResolutionException('Unable to resolve PSR request. Please install the symfony/psr-http-message-bridge and nyholm/psr7 packages.'); diff --git a/tests/Integration/Foundation/Fixtures/laravel.txt.gz b/tests/Integration/Foundation/Fixtures/laravel.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..636ea645842c9b739c587339b0cd3dc14dbd907b GIT binary patch literal 40 wcmb2|=HM`z7?sMvoRe6TSeBZjS5i^J@Yz$xOUL`{LnemFZF~N5FfcFx00?RgXaE2J literal 0 HcmV?d00001 diff --git a/tests/Integration/Foundation/RoutingServiceProviderTest.php b/tests/Integration/Foundation/RoutingServiceProviderTest.php index 4753f03eda02..5825bbd626eb 100644 --- a/tests/Integration/Foundation/RoutingServiceProviderTest.php +++ b/tests/Integration/Foundation/RoutingServiceProviderTest.php @@ -122,6 +122,18 @@ public function testItIncludesMergedDataInServerRequestInterfaceInstancesUsingPo 'request-data' => 'request-data', ]); } + + public function testItHandlesGzippedBodyPayloadsWhenCreatingServerRequestInterfaceInstances() + { + Route::post('test-route', function (ServerRequestInterface $request) { + return gzdecode((string) $request->getBody()); + }); + + $response = $this->call('POST', 'test-route', content: file_get_contents(__DIR__.'/Fixtures/laravel.txt.gz')); + + $response->assertOk(); + $response->assertContent("Laravel\n"); + } } class MergeDataMiddleware