From 1dc10ff6c0861543350b548ae24b441f751ccb54 Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Sat, 11 Apr 2026 13:05:46 +0000 Subject: [PATCH 1/5] Fix: Allow error codes above 399 --- Classes/Helper/ExceptionHelper.php | 19 +++++++++++++++++++ Classes/RoutingMiddleware.php | 11 ++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 Classes/Helper/ExceptionHelper.php diff --git a/Classes/Helper/ExceptionHelper.php b/Classes/Helper/ExceptionHelper.php new file mode 100644 index 0000000..db160d1 --- /dev/null +++ b/Classes/Helper/ExceptionHelper.php @@ -0,0 +1,19 @@ +statusCode = $statusCode; + } +} diff --git a/Classes/RoutingMiddleware.php b/Classes/RoutingMiddleware.php index 5ab9047..9d1016e 100644 --- a/Classes/RoutingMiddleware.php +++ b/Classes/RoutingMiddleware.php @@ -7,6 +7,7 @@ use Flowpack\SeoRouting\Enum\TrailingSlashModeEnum; use Flowpack\SeoRouting\Helper\BlocklistHelper; use Flowpack\SeoRouting\Helper\ConfigurationHelper; +use Flowpack\SeoRouting\Helper\ExceptionHelper; use Flowpack\SeoRouting\Helper\LowerCaseHelper; use Flowpack\SeoRouting\Helper\TrailingSlashHelper; use Neos\Flow\Annotations as Flow; @@ -71,7 +72,15 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } - return $this->responseFactory->createResponse($this->configurationHelper->getStatusCode()) + $statusCode = $this->configurationHelper->getStatusCode(); + + if ($statusCode >= 400) { + $exception = new ExceptionHelper(); + $exception->setStatusCode($statusCode); + throw $exception; + } + + return $this->responseFactory->createResponse(statusCode) ->withAddedHeader('Location', (string)$uri); } } From b153e6e9303457aa9d2cad30005588bf9b02bc5a Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Sat, 11 Apr 2026 16:31:09 +0000 Subject: [PATCH 2/5] Fix: Add missing $ --- Classes/RoutingMiddleware.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/RoutingMiddleware.php b/Classes/RoutingMiddleware.php index 9d1016e..af54c22 100644 --- a/Classes/RoutingMiddleware.php +++ b/Classes/RoutingMiddleware.php @@ -80,7 +80,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface throw $exception; } - return $this->responseFactory->createResponse(statusCode) + return $this->responseFactory->createResponse($statusCode) ->withAddedHeader('Location', (string)$uri); } } From 305720a8b5cf8cd1ecc117b110325716ec7bcd97 Mon Sep 17 00:00:00 2001 From: Jon Uhlmann Date: Sun, 12 Apr 2026 08:18:40 +0000 Subject: [PATCH 3/5] Update: Code cleanup --- Classes/RoutingMiddleware.php | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Classes/RoutingMiddleware.php b/Classes/RoutingMiddleware.php index af54c22..284c8aa 100644 --- a/Classes/RoutingMiddleware.php +++ b/Classes/RoutingMiddleware.php @@ -62,13 +62,9 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $uri = $this->lowerCaseHelper->convertPathToLowerCase($uri); } - if ($uri->getPath() === $oldPath) { - return $handler->handle($request); - } - $response = $handler->handle($request); - - if ($response->getStatusCode() >= 400) { + + if ($uri->getPath() === $oldPath || $response->getStatusCode() >= 400) { return $response; } From eb515a01f0ab27a0afbd7f0496b67ef5baaea528 Mon Sep 17 00:00:00 2001 From: Timon Heuser Date: Mon, 13 Apr 2026 11:35:48 +0200 Subject: [PATCH 4/5] add test and refactoring --- Classes/Exceptions/Http/Exception.php | 20 ++++++++++++++++++++ Classes/Helper/ExceptionHelper.php | 19 ------------------- Classes/RoutingMiddleware.php | 9 +++++---- Tests/Unit/RoutingMiddlewareTest.php | 22 +++++++++++++++++++--- 4 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 Classes/Exceptions/Http/Exception.php delete mode 100644 Classes/Helper/ExceptionHelper.php diff --git a/Classes/Exceptions/Http/Exception.php b/Classes/Exceptions/Http/Exception.php new file mode 100644 index 0000000..e7ae67c --- /dev/null +++ b/Classes/Exceptions/Http/Exception.php @@ -0,0 +1,20 @@ +statusCode = $statusCode; + } +} diff --git a/Classes/Helper/ExceptionHelper.php b/Classes/Helper/ExceptionHelper.php deleted file mode 100644 index db160d1..0000000 --- a/Classes/Helper/ExceptionHelper.php +++ /dev/null @@ -1,19 +0,0 @@ -statusCode = $statusCode; - } -} diff --git a/Classes/RoutingMiddleware.php b/Classes/RoutingMiddleware.php index 284c8aa..458c7b5 100644 --- a/Classes/RoutingMiddleware.php +++ b/Classes/RoutingMiddleware.php @@ -5,9 +5,9 @@ namespace Flowpack\SeoRouting; use Flowpack\SeoRouting\Enum\TrailingSlashModeEnum; +use Flowpack\SeoRouting\Exceptions\Http\Exception as HttpException; use Flowpack\SeoRouting\Helper\BlocklistHelper; use Flowpack\SeoRouting\Helper\ConfigurationHelper; -use Flowpack\SeoRouting\Helper\ExceptionHelper; use Flowpack\SeoRouting\Helper\LowerCaseHelper; use Flowpack\SeoRouting\Helper\TrailingSlashHelper; use Neos\Flow\Annotations as Flow; @@ -34,6 +34,9 @@ class RoutingMiddleware implements MiddlewareInterface #[Flow\Inject] protected LowerCaseHelper $lowerCaseHelper; + /** + * @throws HttpException + */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { $isTrailingSlashEnabled = $this->configurationHelper->isTrailingSlashEnabled(); @@ -71,9 +74,7 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface $statusCode = $this->configurationHelper->getStatusCode(); if ($statusCode >= 400) { - $exception = new ExceptionHelper(); - $exception->setStatusCode($statusCode); - throw $exception; + throw new HttpException($statusCode); } return $this->responseFactory->createResponse($statusCode) diff --git a/Tests/Unit/RoutingMiddlewareTest.php b/Tests/Unit/RoutingMiddlewareTest.php index cd80865..dceb5c5 100644 --- a/Tests/Unit/RoutingMiddlewareTest.php +++ b/Tests/Unit/RoutingMiddlewareTest.php @@ -5,6 +5,7 @@ namespace Flowpack\SeoRouting\Tests\Unit; use Flowpack\SeoRouting\Enum\TrailingSlashModeEnum; +use Flowpack\SeoRouting\Exceptions\Http\Exception as HttpException; use Flowpack\SeoRouting\Helper\BlocklistHelper; use Flowpack\SeoRouting\Helper\ConfigurationHelper; use Flowpack\SeoRouting\Helper\LowerCaseHelper; @@ -23,6 +24,7 @@ use ReflectionClass; #[CoversClass(RoutingMiddleware::class)] +#[CoversClass(HttpException::class)] class RoutingMiddlewareTest extends TestCase { private readonly RoutingMiddleware $routingMiddleware; @@ -82,6 +84,7 @@ public function testProcessShouldHandleUrlsCorrectly( int $statusCode, TrailingSlashModeEnum $trailingSlashMode, int $handlerStatusCode = 200, + ?string $expectedException = null, ): void { $originalUri = new Uri($originalUrl); $expectedUri = new Uri($expectedUrl); @@ -98,8 +101,12 @@ public function testProcessShouldHandleUrlsCorrectly( $this->requestMock->expects($this->once())->method('getUri')->willReturn($originalUri); $pathChanged = $originalUrl !== $expectedUrl; - - if (!$pathChanged) { + if (is_string($expectedException)) { + $this->expectException($expectedException); + $this->responseFactoryMock->expects($this->never())->method('createResponse'); + $this->routingMiddleware->process($this->requestMock, $this->requestHandlerMock); + return; + } elseif (!$pathChanged) { $this->requestHandlerMock->method('handle')->willReturn($this->responseMock); } elseif ($handlerStatusCode >= 400) { $this->responseMock->method('getStatusCode')->willReturn($handlerStatusCode); @@ -122,7 +129,6 @@ public function testProcessShouldHandleUrlsCorrectly( ->with('Location', (string)$expectedUri) ->willReturnSelf(); } - self::assertSame( $this->responseMock, $this->routingMiddleware->process($this->requestMock, $this->requestHandlerMock) @@ -190,6 +196,16 @@ public static function urlsDataProvider(): array 'trailingSlashMode' => TrailingSlashModeEnum::ADD, 'handlerStatusCode' => 404, ], + [ + 'originalUrl' => 'https://local.dev', + 'expectedUrl' => 'https://local.dev/', + 'isTrailingSlashEnabledResult' => true, + 'isToLowerCaseEnabledResult' => false, + 'isUriInBlocklistResult' => false, + 'statusCode' => 404, + 'trailingSlashMode' => TrailingSlashModeEnum::ADD, + 'expectedException' => HttpException::class + ], ]; } } From d13dd9d7f1e31b34e5c4359722dbee5d709c1f0f Mon Sep 17 00:00:00 2001 From: Timon Heuser Date: Mon, 13 Apr 2026 11:37:57 +0200 Subject: [PATCH 5/5] fix phpstan --- Tests/Unit/RoutingMiddlewareTest.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Tests/Unit/RoutingMiddlewareTest.php b/Tests/Unit/RoutingMiddlewareTest.php index dceb5c5..2a6fc81 100644 --- a/Tests/Unit/RoutingMiddlewareTest.php +++ b/Tests/Unit/RoutingMiddlewareTest.php @@ -22,6 +22,7 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use ReflectionClass; +use Throwable; #[CoversClass(RoutingMiddleware::class)] #[CoversClass(HttpException::class)] @@ -74,6 +75,11 @@ protected function setUp(): void } + /** + * @param class-string|null $expectedException + * @throws Exception + * @throws HttpException + */ #[DataProvider('urlsDataProvider')] public function testProcessShouldHandleUrlsCorrectly( string $originalUrl,