From 3680d88fb76ddc4277d3062e313aaab8c2f63279 Mon Sep 17 00:00:00 2001 From: Franz Liedke Date: Tue, 29 May 2018 00:17:13 +0200 Subject: [PATCH] Use PSR-15 middleware standard This finally adopts the new standardized interfaces instead of the work-in-progress ones with the `Interop\` prefix. Since we have now updated to PHP 7.1, we can also use Stratigility 3.0 as the middleware dispatcher. --- composer.json | 7 ++-- .../Middleware/RequireAdministrateAbility.php | 11 ++--- src/Api/Middleware/FakeHttpMethods.php | 11 ++--- src/Api/Middleware/HandleErrors.php | 14 +++---- .../Middleware/AuthenticateWithHeader.php | 11 ++--- .../Middleware/AuthenticateWithSession.php | 11 ++--- src/Http/Middleware/CollectGarbage.php | 11 ++--- src/Http/Middleware/DispatchRoute.php | 11 ++--- src/Http/Middleware/HandleErrors.php | 14 +++---- src/Http/Middleware/ParseJsonBody.php | 11 ++--- src/Http/Middleware/RememberFromCookie.php | 11 ++--- src/Http/Middleware/SetLocale.php | 11 ++--- .../Middleware/ShareErrorsFromSession.php | 11 ++--- src/Http/Middleware/StartSession.php | 10 ++--- src/Http/Server.php | 42 +++++++++++-------- 15 files changed, 101 insertions(+), 96 deletions(-) diff --git a/composer.json b/composer.json index 6d01cf6e0..9039b4d34 100644 --- a/composer.json +++ b/composer.json @@ -47,6 +47,8 @@ "nikic/fast-route": "^0.6", "oyejorge/less.php": "~1.5", "psr/http-message": "^1.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", "symfony/config": "^3.3", "symfony/console": "^3.3", "symfony/http-foundation": "^3.3", @@ -54,9 +56,8 @@ "symfony/yaml": "^3.3", "s9e/text-formatter": "^0.8.1", "tobscure/json-api": "^0.3.0", - "zendframework/zend-diactoros": "^1.6", - "zendframework/zend-stratigility": "^2.2", - "http-interop/http-middleware": "^0.4.0" + "zendframework/zend-diactoros": "^1.7", + "zendframework/zend-stratigility": "^3.0" }, "require-dev": { "mockery/mockery": "^0.9.4", diff --git a/src/Admin/Middleware/RequireAdministrateAbility.php b/src/Admin/Middleware/RequireAdministrateAbility.php index 63758f979..7d478e41c 100644 --- a/src/Admin/Middleware/RequireAdministrateAbility.php +++ b/src/Admin/Middleware/RequireAdministrateAbility.php @@ -12,18 +12,19 @@ namespace Flarum\Admin\Middleware; use Flarum\User\AssertPermissionTrait; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class RequireAdministrateAbility implements MiddlewareInterface +class RequireAdministrateAbility implements Middleware { use AssertPermissionTrait; - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $this->assertAdmin($request->getAttribute('actor')); - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Api/Middleware/FakeHttpMethods.php b/src/Api/Middleware/FakeHttpMethods.php index 19dacef6f..2791ae06a 100644 --- a/src/Api/Middleware/FakeHttpMethods.php +++ b/src/Api/Middleware/FakeHttpMethods.php @@ -11,15 +11,16 @@ namespace Flarum\Api\Middleware; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class FakeHttpMethods implements MiddlewareInterface +class FakeHttpMethods implements Middleware { const HEADER_NAME = 'x-http-method-override'; - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { if ($request->getMethod() === 'POST' && $request->hasHeader(self::HEADER_NAME)) { $fakeMethod = $request->getHeaderLine(self::HEADER_NAME); @@ -27,6 +28,6 @@ class FakeHttpMethods implements MiddlewareInterface $request = $request->withMethod(strtoupper($fakeMethod)); } - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Api/Middleware/HandleErrors.php b/src/Api/Middleware/HandleErrors.php index 6f61b75f3..bba861ac2 100644 --- a/src/Api/Middleware/HandleErrors.php +++ b/src/Api/Middleware/HandleErrors.php @@ -13,12 +13,12 @@ namespace Flarum\Api\Middleware; use Exception; use Flarum\Api\ErrorHandler; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class HandleErrors implements MiddlewareInterface +class HandleErrors implements Middleware { /** * @var ErrorHandler @@ -35,15 +35,11 @@ class HandleErrors implements MiddlewareInterface /** * Catch all errors that happen during further middleware execution. - * - * @param Request $request - * @param DelegateInterface $delegate - * @return Response */ - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { try { - return $delegate->process($request); + return $handler->handle($request); } catch (Exception $e) { return $this->errorHandler->handle($e); } diff --git a/src/Http/Middleware/AuthenticateWithHeader.php b/src/Http/Middleware/AuthenticateWithHeader.php index 31d112744..658d064ab 100644 --- a/src/Http/Middleware/AuthenticateWithHeader.php +++ b/src/Http/Middleware/AuthenticateWithHeader.php @@ -14,15 +14,16 @@ namespace Flarum\Http\Middleware; use Flarum\Api\ApiKey; use Flarum\Http\AccessToken; use Flarum\User\User; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class AuthenticateWithHeader implements MiddlewareInterface +class AuthenticateWithHeader implements Middleware { const TOKEN_PREFIX = 'Token '; - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $headerLine = $request->getHeaderLine('authorization'); @@ -50,7 +51,7 @@ class AuthenticateWithHeader implements MiddlewareInterface } } - return $delegate->process($request); + return $handler->handle($request); } private function getUser($string) diff --git a/src/Http/Middleware/AuthenticateWithSession.php b/src/Http/Middleware/AuthenticateWithSession.php index 4c780925b..712185266 100644 --- a/src/Http/Middleware/AuthenticateWithSession.php +++ b/src/Http/Middleware/AuthenticateWithSession.php @@ -14,13 +14,14 @@ namespace Flarum\Http\Middleware; use Flarum\User\Guest; use Flarum\User\User; use Illuminate\Contracts\Session\Session; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class AuthenticateWithSession implements MiddlewareInterface +class AuthenticateWithSession implements Middleware { - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $session = $request->getAttribute('session'); @@ -30,7 +31,7 @@ class AuthenticateWithSession implements MiddlewareInterface $request = $request->withAttribute('actor', $actor); - return $delegate->process($request); + return $handler->handle($request); } private function getActor(Session $session) diff --git a/src/Http/Middleware/CollectGarbage.php b/src/Http/Middleware/CollectGarbage.php index f4882c9fb..e32b99c1b 100644 --- a/src/Http/Middleware/CollectGarbage.php +++ b/src/Http/Middleware/CollectGarbage.php @@ -16,12 +16,13 @@ use Flarum\User\AuthToken; use Flarum\User\EmailToken; use Flarum\User\PasswordToken; use Illuminate\Contracts\Config\Repository as ConfigRepository; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; use SessionHandlerInterface; -class CollectGarbage implements MiddlewareInterface +class CollectGarbage implements Middleware { /** * @var SessionHandlerInterface @@ -39,11 +40,11 @@ class CollectGarbage implements MiddlewareInterface $this->sessionConfig = $config->get('session'); } - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $this->collectGarbageSometimes(); - return $delegate->process($request); + return $handler->handle($request); } private function collectGarbageSometimes() diff --git a/src/Http/Middleware/DispatchRoute.php b/src/Http/Middleware/DispatchRoute.php index cc5e94750..ee4670d40 100644 --- a/src/Http/Middleware/DispatchRoute.php +++ b/src/Http/Middleware/DispatchRoute.php @@ -15,12 +15,12 @@ use FastRoute\Dispatcher; use Flarum\Http\Exception\MethodNotAllowedException; use Flarum\Http\Exception\RouteNotFoundException; use Flarum\Http\RouteCollection; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class DispatchRoute implements MiddlewareInterface +class DispatchRoute implements Middleware { /** * @var RouteCollection @@ -45,13 +45,10 @@ class DispatchRoute implements MiddlewareInterface /** * Dispatch the given request to our route collection. * - * @param Request $request - * @param DelegateInterface $delegate - * @return Response * @throws MethodNotAllowedException * @throws RouteNotFoundException */ - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $method = $request->getMethod(); $uri = $request->getUri()->getPath() ?: '/'; diff --git a/src/Http/Middleware/HandleErrors.php b/src/Http/Middleware/HandleErrors.php index a41ebf05e..8df217bf3 100644 --- a/src/Http/Middleware/HandleErrors.php +++ b/src/Http/Middleware/HandleErrors.php @@ -15,15 +15,15 @@ use Exception; use Flarum\Settings\SettingsRepositoryInterface; use Franzl\Middleware\Whoops\WhoopsRunner; use Illuminate\Contracts\View\Factory as ViewFactory; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; use Psr\Log\LoggerInterface; use Symfony\Component\Translation\TranslatorInterface; use Zend\Diactoros\Response\HtmlResponse; -class HandleErrors implements MiddlewareInterface +class HandleErrors implements Middleware { /** * @var ViewFactory @@ -68,15 +68,11 @@ class HandleErrors implements MiddlewareInterface /** * Catch all errors that happen during further middleware execution. - * - * @param Request $request - * @param DelegateInterface $delegate - * @return Response */ - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { try { - return $delegate->process($request); + return $handler->handle($request); } catch (Exception $e) { if ($this->debug) { return WhoopsRunner::handle($e, $request); diff --git a/src/Http/Middleware/ParseJsonBody.php b/src/Http/Middleware/ParseJsonBody.php index f4ffb3782..8137eb0cc 100644 --- a/src/Http/Middleware/ParseJsonBody.php +++ b/src/Http/Middleware/ParseJsonBody.php @@ -11,13 +11,14 @@ namespace Flarum\Http\Middleware; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class ParseJsonBody implements MiddlewareInterface +class ParseJsonBody implements Middleware { - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { if (str_contains($request->getHeaderLine('content-type'), 'json')) { $input = json_decode($request->getBody(), true); @@ -25,6 +26,6 @@ class ParseJsonBody implements MiddlewareInterface $request = $request->withParsedBody($input ?: []); } - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Http/Middleware/RememberFromCookie.php b/src/Http/Middleware/RememberFromCookie.php index 335c43198..bf5e75424 100644 --- a/src/Http/Middleware/RememberFromCookie.php +++ b/src/Http/Middleware/RememberFromCookie.php @@ -13,11 +13,12 @@ namespace Flarum\Http\Middleware; use Flarum\Http\AccessToken; use Flarum\Http\CookieFactory; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class RememberFromCookie implements MiddlewareInterface +class RememberFromCookie implements Middleware { /** * @var CookieFactory @@ -32,7 +33,7 @@ class RememberFromCookie implements MiddlewareInterface $this->cookie = $cookie; } - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $id = array_get($request->getCookieParams(), $this->cookie->getName('remember')); @@ -48,6 +49,6 @@ class RememberFromCookie implements MiddlewareInterface } } - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Http/Middleware/SetLocale.php b/src/Http/Middleware/SetLocale.php index 9731a8821..bcb37a9da 100644 --- a/src/Http/Middleware/SetLocale.php +++ b/src/Http/Middleware/SetLocale.php @@ -12,11 +12,12 @@ namespace Flarum\Http\Middleware; use Flarum\Locale\LocaleManager; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; -class SetLocale implements MiddlewareInterface +class SetLocale implements Middleware { /** * @var LocaleManager @@ -31,7 +32,7 @@ class SetLocale implements MiddlewareInterface $this->locales = $locales; } - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $actor = $request->getAttribute('actor'); @@ -45,6 +46,6 @@ class SetLocale implements MiddlewareInterface $this->locales->setLocale($locale); } - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Http/Middleware/ShareErrorsFromSession.php b/src/Http/Middleware/ShareErrorsFromSession.php index 774fdf0d5..d53a1d188 100644 --- a/src/Http/Middleware/ShareErrorsFromSession.php +++ b/src/Http/Middleware/ShareErrorsFromSession.php @@ -13,16 +13,17 @@ namespace Flarum\Http\Middleware; use Illuminate\Contracts\View\Factory as ViewFactory; use Illuminate\Support\ViewErrorBag; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; +use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; /** * Inspired by Illuminate\View\Middleware\ShareErrorsFromSession. * * @author Taylor Otwell */ -class ShareErrorsFromSession implements MiddlewareInterface +class ShareErrorsFromSession implements Middleware { /** * @var ViewFactory @@ -37,7 +38,7 @@ class ShareErrorsFromSession implements MiddlewareInterface $this->view = $view; } - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $session = $request->getAttribute('session'); @@ -54,6 +55,6 @@ class ShareErrorsFromSession implements MiddlewareInterface $session->remove('errors'); - return $delegate->process($request); + return $handler->handle($request); } } diff --git a/src/Http/Middleware/StartSession.php b/src/Http/Middleware/StartSession.php index 4fbd1b8e6..f5aee1573 100644 --- a/src/Http/Middleware/StartSession.php +++ b/src/Http/Middleware/StartSession.php @@ -16,13 +16,13 @@ use Flarum\Http\CookieFactory; use Illuminate\Contracts\Config\Repository as ConfigRepository; use Illuminate\Contracts\Session\Session; use Illuminate\Session\Store; -use Interop\Http\ServerMiddleware\DelegateInterface; -use Interop\Http\ServerMiddleware\MiddlewareInterface; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; use SessionHandlerInterface; -class StartSession implements MiddlewareInterface +class StartSession implements Middleware { /** * @var SessionHandlerInterface @@ -51,7 +51,7 @@ class StartSession implements MiddlewareInterface $this->config = $config->get('session'); } - public function process(Request $request, DelegateInterface $delegate) + public function process(Request $request, Handler $handler): Response { $request = $request->withAttribute( 'session', @@ -59,7 +59,7 @@ class StartSession implements MiddlewareInterface ); $session->start(); - $response = $delegate->process($request); + $response = $handler->handle($request); $session->save(); $response = $this->withCsrfTokenHeader($response, $session); diff --git a/src/Http/Server.php b/src/Http/Server.php index 222d177fe..9583d9180 100644 --- a/src/Http/Server.php +++ b/src/Http/Server.php @@ -18,16 +18,17 @@ use Flarum\Http\Middleware\HandleErrors; use Flarum\Http\Middleware\StartSession; use Flarum\Install\InstallServiceProvider; use Flarum\Update\UpdateServiceProvider; -use Interop\Http\ServerMiddleware\MiddlewareInterface; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Server\MiddlewareInterface as Middleware; +use Psr\Http\Server\RequestHandlerInterface as Handler; use Zend\Diactoros\Response\HtmlResponse; use Zend\Diactoros\Server as DiactorosServer; use Zend\Stratigility\MiddlewarePipe; -use Zend\Stratigility\NoopFinalHandler; +use function Zend\Stratigility\middleware; use function Zend\Stratigility\path; -class Server +class Server implements Middleware, Handler { /** * @param Site $site @@ -46,33 +47,38 @@ class Server public function listen() { DiactorosServer::createServer( - $this, + [$this, 'handle'], $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES - )->listen(new NoopFinalHandler()); + )->listen(); } /** - * Use as PSR-7 middleware. - * - * @param ServerRequestInterface $request - * @param ResponseInterface $response - * @param callable $out - * @return ResponseInterface + * Use as PSR-15 middleware. */ - public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $out) + public function process(Request $request, Handler $handler): Response { $middleware = $this->getMiddleware($request->getUri()->getPath()); - return $middleware($request, $response, $out); + return $middleware->process($request, $handler); + } + + /** + * Use as PSR-15 request handler. + */ + public function handle(Request $request): Response + { + $middleware = $this->getMiddleware($request->getUri()->getPath()); + + return $middleware->handle($request); } /** * @param string $requestPath - * @return MiddlewareInterface + * @return MiddlewarePipe */ protected function getMiddleware($requestPath) { @@ -126,9 +132,9 @@ class Server protected function getMaintenanceMiddleware(MiddlewarePipe $pipe) { - $pipe->pipe(function () { + $pipe->pipe(middleware(function () { return new HtmlResponse(file_get_contents($this->getErrorDir().'/503.html', 503)); - }); + })); // TODO: FOR API render JSON-API error document for HTTP 503