diff --git a/Classes/RoutingMiddleware.php b/Classes/RoutingMiddleware.php index 59e9776..5ab9047 100644 --- a/Classes/RoutingMiddleware.php +++ b/Classes/RoutingMiddleware.php @@ -65,8 +65,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $handler->handle($request); } - $response = $this->responseFactory->createResponse($this->configurationHelper->getStatusCode()); + $response = $handler->handle($request); - return $response->withAddedHeader('Location', (string)$uri); + if ($response->getStatusCode() >= 400) { + return $response; + } + + return $this->responseFactory->createResponse($this->configurationHelper->getStatusCode()) + ->withAddedHeader('Location', (string)$uri); } } diff --git a/Tests/Unit/RoutingMiddlewareTest.php b/Tests/Unit/RoutingMiddlewareTest.php index b9d23ea..cd80865 100644 --- a/Tests/Unit/RoutingMiddlewareTest.php +++ b/Tests/Unit/RoutingMiddlewareTest.php @@ -81,6 +81,7 @@ public function testProcessShouldHandleUrlsCorrectly( bool $isUriInBlocklistResult, int $statusCode, TrailingSlashModeEnum $trailingSlashMode, + int $handlerStatusCode = 200, ): void { $originalUri = new Uri($originalUrl); $expectedUri = new Uri($expectedUrl); @@ -96,9 +97,19 @@ public function testProcessShouldHandleUrlsCorrectly( $this->requestMock->expects($this->once())->method('getUri')->willReturn($originalUri); - if ($originalUrl === $expectedUrl) { + $pathChanged = $originalUrl !== $expectedUrl; + + if (!$pathChanged) { + $this->requestHandlerMock->method('handle')->willReturn($this->responseMock); + } elseif ($handlerStatusCode >= 400) { + $this->responseMock->method('getStatusCode')->willReturn($handlerStatusCode); $this->requestHandlerMock->method('handle')->willReturn($this->responseMock); + $this->responseFactoryMock->expects($this->never())->method('createResponse'); } else { + $handlerResponseMock = $this->createMock(ResponseInterface::class); + $handlerResponseMock->method('getStatusCode')->willReturn($handlerStatusCode); + $this->requestHandlerMock->method('handle')->willReturn($handlerResponseMock); + $this->responseFactoryMock ->expects($this->once()) ->method('createResponse') @@ -169,6 +180,16 @@ public static function urlsDataProvider(): array 'statusCode' => 301, 'trailingSlashMode' => TrailingSlashModeEnum::REMOVE, ], + [ + 'originalUrl' => 'https://local.dev/missing', + 'expectedUrl' => 'https://local.dev/missing/', + 'isTrailingSlashEnabledResult' => true, + 'isToLowerCaseEnabledResult' => false, + 'isUriInBlocklistResult' => false, + 'statusCode' => 301, + 'trailingSlashMode' => TrailingSlashModeEnum::ADD, + 'handlerStatusCode' => 404, + ], ]; } }