Fixed middleware on / issue.

This commit is contained in:
flash 2024-08-18 16:41:02 +00:00
parent f690df4200
commit 57f8c69ca0
3 changed files with 29 additions and 6 deletions

View file

@ -1 +1 @@
0.2408.181620
0.2408.181640

View file

@ -1,7 +1,7 @@
<?php
// HttpRouter.php
// Created: 2024-03-28
// Updated: 2024-08-04
// Updated: 2024-08-18
namespace Index\Http\Routing;
@ -151,9 +151,12 @@ class HttpRouter implements IRouter {
$mwInfo['handler'] = $handler;
$prepared = self::preparePath($path, true);
if($prepared === false)
if($prepared === false) {
if(str_ends_with($path, '/'))
$path = substr($path, 0, -1);
$mwInfo['prefix'] = $path;
else
} else
$mwInfo['match'] = $prepared;
$this->middlewares[] = $mwInfo;
@ -213,7 +216,7 @@ class HttpRouter implements IRouter {
array_shift($args);
} elseif(array_key_exists('prefix', $mwInfo)) {
if(!str_starts_with($path, $mwInfo['prefix']))
if($mwInfo['prefix'] !== '' && !str_starts_with($path, $mwInfo['prefix']))
continue;
$args = [];

View file

@ -1,12 +1,13 @@
<?php
// RouterTest.php
// Created: 2022-01-20
// Updated: 2024-07-31
// Updated: 2024-08-18
declare(strict_types=1);
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass;
use Index\Http\{HttpHeaders,HttpRequest};
use Index\Http\Routing\{HttpGet,HttpMiddleware,HttpPost,HttpPut,HttpRouter,RouteHandler};
/**
@ -162,4 +163,23 @@ final class RouterTest extends TestCase {
$this->assertEquals(['OPTIONS', 'GET', 'DELETE'], $resolved->getSupportedMethods());
}
public function testMiddlewareInterceptionOnRoot(): void {
$router = new HttpRouter;
$router->use('/', fn() => 'expected');
$router->get('/', fn() => 'unexpected');
$router->get('/test', fn() => 'also unexpected');
ob_start();
$router->dispatch(new HttpRequest('1.1', 'GET', '/', [], [], new HttpHeaders([]), null));
$this->assertEquals('expected', ob_get_clean());
ob_start();
$router->dispatch(new HttpRequest('1.1', 'GET', '/test', [], [], new HttpHeaders([]), null));
$this->assertEquals('expected', ob_get_clean());
ob_start();
$router->dispatch(new HttpRequest('1.1', 'GET', '/error', [], [], new HttpHeaders([]), null));
$this->assertEquals('expected', ob_get_clean());
}
}