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 000000000000..636ea645842c Binary files /dev/null and b/tests/Integration/Foundation/Fixtures/laravel.txt.gz differ 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