Skip to content

Commit 0471b68

Browse files
committed
fix: status code above 399 handling leads to unwanted redirects
#13
1 parent b451faf commit 0471b68

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

Classes/RoutingMiddleware.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
6565
return $handler->handle($request);
6666
}
6767

68-
$response = $this->responseFactory->createResponse($this->configurationHelper->getStatusCode());
68+
$response = $handler->handle($request);
6969

70-
return $response->withAddedHeader('Location', (string)$uri);
70+
if ($response->getStatusCode() >= 400) {
71+
return $response;
72+
}
73+
74+
return $this->responseFactory->createResponse($this->configurationHelper->getStatusCode())
75+
->withAddedHeader('Location', (string)$uri);
7176
}
7277
}

Tests/Unit/RoutingMiddlewareTest.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public function testProcessShouldHandleUrlsCorrectly(
8181
bool $isUriInBlocklistResult,
8282
int $statusCode,
8383
TrailingSlashModeEnum $trailingSlashMode,
84+
int $handlerStatusCode = 200,
8485
): void {
8586
$originalUri = new Uri($originalUrl);
8687
$expectedUri = new Uri($expectedUrl);
@@ -96,9 +97,19 @@ public function testProcessShouldHandleUrlsCorrectly(
9697

9798
$this->requestMock->expects($this->once())->method('getUri')->willReturn($originalUri);
9899

99-
if ($originalUrl === $expectedUrl) {
100+
$pathChanged = $originalUrl !== $expectedUrl;
101+
102+
if (!$pathChanged) {
103+
$this->requestHandlerMock->method('handle')->willReturn($this->responseMock);
104+
} elseif ($handlerStatusCode >= 400) {
105+
$this->responseMock->method('getStatusCode')->willReturn($handlerStatusCode);
100106
$this->requestHandlerMock->method('handle')->willReturn($this->responseMock);
107+
$this->responseFactoryMock->expects($this->never())->method('createResponse');
101108
} else {
109+
$handlerResponseMock = $this->createMock(ResponseInterface::class);
110+
$handlerResponseMock->method('getStatusCode')->willReturn($handlerStatusCode);
111+
$this->requestHandlerMock->method('handle')->willReturn($handlerResponseMock);
112+
102113
$this->responseFactoryMock
103114
->expects($this->once())
104115
->method('createResponse')
@@ -169,6 +180,16 @@ public static function urlsDataProvider(): array
169180
'statusCode' => 301,
170181
'trailingSlashMode' => TrailingSlashModeEnum::REMOVE,
171182
],
183+
[
184+
'originalUrl' => 'https://local.dev/missing',
185+
'expectedUrl' => 'https://local.dev/missing/',
186+
'isTrailingSlashEnabledResult' => true,
187+
'isToLowerCaseEnabledResult' => false,
188+
'isUriInBlocklistResult' => false,
189+
'statusCode' => 301,
190+
'trailingSlashMode' => TrailingSlashModeEnum::ADD,
191+
'handlerStatusCode' => 404,
192+
],
172193
];
173194
}
174195
}

0 commit comments

Comments
 (0)