Peak/Http

Http stack represent a pipeline of middlewares designed to handle an http request and/or return a reponse.

To work properly, a stack will need a HandlerResolver with a container which may have PSR-11 container to resolve middlewares.

use Peak\Di\Container;
use Peak\Http\Request\HandlerResolver;
use Peak\Http\Stack;

$container = new Container();
$handlerResolver = new HandlerResolver($container);
$stack = new Stack([
    MiddlewareA::class,
], $handlerResolver);

Any PSR-15 middleware can be added to a stack. A stack itself can be added to a parent stack.

$stack = new Stack([
    MiddlewareA::class,
    new Stack([
        MiddlewareC::class,
        MiddlewareD::class,
        new Stack([
            MiddlewareE::class,
            MiddlewareF::class,
        ], $handlerResolver),
    ], $handlerResolver),
    MiddlewareB::class,
], $handlerResolver);

It also support simple closure but behind the scene, closure are bridged to a valid Psr\Http\Server\MiddlewareInterface

$stack = new Stack([
    MiddlewareA::class,
    function(ServerRequestInterface $req, RequestHandlerInterface $next) {
        // do something with the request and call next
        return $next->handle($req);
    },
    function() {
        return new TextResponse('Ok', 200);
    },
], $handlerResolver);

Resolve a http request compatible PSR-7 ServerRequestInterface with the method handle()

$response = $stack->handle($request);