diff options
Diffstat (limited to 'src/Router/Middleware/ErrorPage.php')
-rw-r--r-- | src/Router/Middleware/ErrorPage.php | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/Router/Middleware/ErrorPage.php b/src/Router/Middleware/ErrorPage.php index 8a7b03e..9758b34 100644 --- a/src/Router/Middleware/ErrorPage.php +++ b/src/Router/Middleware/ErrorPage.php @@ -3,6 +3,7 @@ namespace Jasny\Router\Middleware; use Jasny\RouterInterface; +use Jasny\HttpMessage\GlobalEnvironmentInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; @@ -54,19 +55,41 @@ class ErrorPage $nextResponse = $next($request, $response); return $this->isErrorStatus($nextResponse->getStatusCode()) - ? $this->routeToErrorPage($request, $nextResponse) + ? $this->routeToErrorPage($this->reviveRequest($request), $nextResponse) : $nextResponse; } + + /** + * Revive a stale request + * + * @param ServerRequestInterface $request + * @return ServerRequestInterface + */ + protected function reviveRequest(ServerRequestInterface $request) + { + $isStale = interface_exists('Jasny\HttpMessage\GlobalEnvironmentInterface') && + $request instanceof GlobalEnvironmentInterface && + $request->isStale(); + + return $isStale ? $request->revive() : $request; + } /** - * Route to the error page - * + * Get the route to the error page + * * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @return ResponseInterface + * @param ResponseInterface $response + * @return Router\Route */ - protected function routeToErrorPage(ServerRequestInterface $request, ResponseInterface $response) + protected function getErrorRoute(ServerRequestInterface $request, ResponseInterface $response) { + if ( + interface_exists('Jasny\HttpMessage\GlobalEnvironmentInterface') && + $request instanceof GlobalEnvironmentInterface + ) { + $request = $request->withoutGlobalEnvironment(); + } + $status = $response->getStatusCode(); $errorUri = $request->getUri() @@ -74,7 +97,19 @@ class ErrorPage ->withQuery(null) ->withFragment(null); - $errorRoute = $this->router->getRoutes()->getRoute($request->withUri($errorUri)); + return $this->router->getRoutes()->getRoute($request->withUri($errorUri)); + } + + /** + * Route to the error page + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @return ResponseInterface + */ + protected function routeToErrorPage(ServerRequestInterface $request, ResponseInterface $response) + { + $errorRoute = $this->getErrorRoute($request, $response); if (!isset($errorRoute)) { return $response; |