Skip to content

Commit 0f3bf23

Browse files
authored
fix: Ported master’s route injection behavior to 0.33.x (#209)
* Ported master’s route injection behavior to 0.33.x by registering the route resource after wildcard resolution * run lint * addressed comments
1 parent 0ba25e1 commit 0f3bf23

2 files changed

Lines changed: 139 additions & 7 deletions

File tree

src/Http/Http.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,17 @@ private function runInternal(Request $request, Response $response): static
919919
$this->matchedRoute = $route;
920920
$groups = ($route instanceof Route) ? $route->getGroups() : [];
921921

922+
if (null === $route && null !== self::$wildcardRoute) {
923+
$route = self::$wildcardRoute;
924+
$this->route = $route;
925+
$path = \parse_url($request->getURI(), PHP_URL_PATH);
926+
$route->path($path);
927+
}
928+
929+
self::setResource('route', function () use ($route, $request) {
930+
return $route ?? new Route($request->getMethod(), $request->getURI());
931+
});
932+
922933
if (self::REQUEST_METHOD_HEAD == $method) {
923934
$method = self::REQUEST_METHOD_GET;
924935
$response->disablePayload();
@@ -961,13 +972,6 @@ private function runInternal(Request $request, Response $response): static
961972
return $this;
962973
}
963974

964-
if (null === $route && null !== self::$wildcardRoute) {
965-
$route = self::$wildcardRoute;
966-
$this->route = $route;
967-
$path = \parse_url($request->getURI(), PHP_URL_PATH);
968-
$route->path($path);
969-
}
970-
971975
if (null !== $route) {
972976
return $this->execute($route, $request, $response);
973977
} elseif (self::REQUEST_METHOD_OPTIONS == $method) {

tests/HttpTest.php

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,134 @@ public function testCanSetRoute()
449449
$this->assertEquals($this->app->getRoute(), $route);
450450
}
451451

452+
public function testRouteInjectionAvailableInInit(): void
453+
{
454+
$request = (new Request())
455+
->setMethod('GET')
456+
->setURI('/route-inject-init');
457+
458+
Http::init()
459+
->inject('route')
460+
->inject('response')
461+
->action(function (Route $route, Response $response) {
462+
$response
463+
->addHeader('X-Init-Route', $route->getPath())
464+
->addHeader('X-Init-Method', $route->getMethod());
465+
});
466+
467+
Http::get('/route-inject-init')
468+
->action(function () {
469+
});
470+
471+
$response = new Response();
472+
$this->app->run($request, $response);
473+
$headers = $response->getHeaders();
474+
475+
$this->assertSame('/route-inject-init', $headers['X-Init-Route'] ?? null);
476+
$this->assertSame('GET', $headers['X-Init-Method'] ?? null);
477+
}
478+
479+
public function testRouteInjectionAvailableInRouteAction(): void
480+
{
481+
$request = (new Request())
482+
->setMethod('GET')
483+
->setURI('/route-inject-action');
484+
485+
Http::get('/route-inject-action')
486+
->inject('route')
487+
->inject('response')
488+
->action(function (Route $route, Response $response) {
489+
$response
490+
->addHeader('X-Action-Route', $route->getPath())
491+
->addHeader('X-Action-Method', $route->getMethod());
492+
});
493+
494+
$response = new Response();
495+
$this->app->run($request, $response);
496+
$headers = $response->getHeaders();
497+
498+
$this->assertSame('/route-inject-action', $headers['X-Action-Route'] ?? null);
499+
$this->assertSame('GET', $headers['X-Action-Method'] ?? null);
500+
}
501+
502+
public function testRouteInjectionAvailableForOptions(): void
503+
{
504+
$request = (new Request())
505+
->setMethod('OPTIONS')
506+
->setURI('/options-route');
507+
508+
Http::options()
509+
->inject('route')
510+
->inject('response')
511+
->action(function (Route $route, Response $response) {
512+
$response
513+
->addHeader('X-Options-Route', $route->getPath())
514+
->addHeader('X-Options-Method', $route->getMethod());
515+
});
516+
517+
$response = new Response();
518+
$this->app->run($request, $response);
519+
$headers = $response->getHeaders();
520+
521+
$this->assertSame('/options-route', $headers['X-Options-Route'] ?? null);
522+
$this->assertSame('OPTIONS', $headers['X-Options-Method'] ?? null);
523+
}
524+
525+
public function testRouteInjectionAvailableInShutdown(): void
526+
{
527+
$request = (new Request())
528+
->setMethod('GET')
529+
->setURI('/route-inject-shutdown');
530+
531+
Http::shutdown()
532+
->inject('route')
533+
->inject('response')
534+
->action(function (Route $route, Response $response) {
535+
$response
536+
->addHeader('X-Shutdown-Route', $route->getPath())
537+
->addHeader('X-Shutdown-Method', $route->getMethod());
538+
});
539+
540+
Http::get('/route-inject-shutdown')
541+
->action(function () {
542+
});
543+
544+
$response = new Response();
545+
$this->app->run($request, $response);
546+
$headers = $response->getHeaders();
547+
548+
$this->assertSame('/route-inject-shutdown', $headers['X-Shutdown-Route'] ?? null);
549+
$this->assertSame('GET', $headers['X-Shutdown-Method'] ?? null);
550+
}
551+
552+
public function testRouteInjectionAvailableInError(): void
553+
{
554+
$request = (new Request())
555+
->setMethod('GET')
556+
->setURI('/route-inject-error');
557+
558+
Http::error()
559+
->inject('route')
560+
->inject('response')
561+
->action(function (Route $route, Response $response) {
562+
$response
563+
->addHeader('X-Error-Route', $route->getPath())
564+
->addHeader('X-Error-Method', $route->getMethod());
565+
});
566+
567+
Http::get('/route-inject-error')
568+
->action(function () {
569+
throw new Exception('Error');
570+
});
571+
572+
$response = new Response();
573+
$this->app->run($request, $response);
574+
$headers = $response->getHeaders();
575+
576+
$this->assertSame('/route-inject-error', $headers['X-Error-Route'] ?? null);
577+
$this->assertSame('GET', $headers['X-Error-Method'] ?? null);
578+
}
579+
452580
public function providerRouteMatching(): array
453581
{
454582
return [

0 commit comments

Comments
 (0)