|
11 | 11 | use Tempest\Http\Request; |
12 | 12 | use Tempest\Http\Response; |
13 | 13 | use Tempest\Http\Responses\Ok; |
| 14 | +use Tempest\Http\Session\VerifyCsrfMiddleware; |
14 | 15 | use Tempest\Router\Exceptions\ControllerActionHadNoReturn; |
15 | 16 | use Tempest\Router\Exceptions\MatchedRouteCouldNotBeResolved; |
16 | 17 | use Tempest\Router\Routing\Matching\RouteMatcher; |
@@ -70,12 +71,32 @@ private function getCallable(): HttpMiddlewareCallable |
70 | 71 | $middlewareStack = $this->routeConfig->middleware; |
71 | 72 |
|
72 | 73 | foreach ($middlewareStack->unwrap() as $middlewareClass) { |
73 | | - $callable = new HttpMiddlewareCallable(function (Request $request) use ($middlewareClass, $callable) { |
74 | | - // We skip this middleware if it's ignored by the route |
| 74 | + $callable = new HttpMiddlewareCallable(closure: function (Request $request) use ($middlewareClass, $callable) { |
75 | 75 | if ($this->container->has(MatchedRoute::class)) { |
76 | 76 | $matchedRoute = $this->container->get(MatchedRoute::class); |
77 | 77 |
|
78 | | - if (in_array($middlewareClass->getName(), $matchedRoute->route->without, strict: true)) { |
| 78 | + // Skip the middleware if it's ignored by the route |
| 79 | + if (in_array( |
| 80 | + needle: $middlewareClass->getName(), |
| 81 | + haystack: $matchedRoute->route->without, |
| 82 | + strict: true, |
| 83 | + )) { |
| 84 | + return $callable($request); |
| 85 | + } |
| 86 | + |
| 87 | + // Skip middleware that sets cookies or session values when the route is stateless |
| 88 | + if ( |
| 89 | + $matchedRoute->route->handler->hasAttribute(Stateless::class) |
| 90 | + && in_array( |
| 91 | + needle: $middlewareClass->getName(), |
| 92 | + haystack: [ |
| 93 | + VerifyCsrfMiddleware::class, |
| 94 | + SetCurrentUrlMiddleware::class, |
| 95 | + SetCookieMiddleware::class, |
| 96 | + ], |
| 97 | + strict: true, |
| 98 | + ) |
| 99 | + ) { |
79 | 100 | return $callable($request); |
80 | 101 | } |
81 | 102 | } |
|
0 commit comments