Skip to main content

Middleware Contract

use Cognesy\Http\Contracts\CanHandleHttpRequest;
use Cognesy\Http\Contracts\HttpMiddleware;
use Cognesy\Http\Data\HttpRequest;
use Cognesy\Http\Data\HttpResponse;

final class AddRequestIdMiddleware implements HttpMiddleware
{
    public function handle(HttpRequest $request, CanHandleHttpRequest $next): HttpResponse {
        return $next->handle($request->withHeader('X-Request-Id', uniqid('req_', true)));
    }
}
// @doctest id="09f3"

Base Middleware Hooks

use Cognesy\Http\Data\HttpRequest;
use Cognesy\Http\Data\HttpResponse;
use Cognesy\Http\Middleware\Base\BaseMiddleware;

final class AuthMiddleware extends BaseMiddleware
{
    protected function beforeRequest(HttpRequest $request): HttpRequest {
        return $request->withHeader('Authorization', 'Bearer ' . getenv('API_TOKEN'));
    }

    protected function afterRequest(HttpRequest $request, HttpResponse $response): HttpResponse {
        return $response;
    }
}
// @doctest id="3da2"

Decorate Streaming Responses

use Cognesy\Http\Data\HttpRequest;
use Cognesy\Http\Data\HttpResponse;
use Cognesy\Http\Middleware\Base\BaseMiddleware;
use Cognesy\Http\Middleware\Base\BaseResponseDecorator;

final class TrimChunkMiddleware extends BaseMiddleware
{
    protected function shouldDecorateResponse(HttpRequest $request, HttpResponse $response): bool {
        return $response->isStreamed();
    }

    protected function toResponse(HttpRequest $request, HttpResponse $response): HttpResponse {
        return BaseResponseDecorator::decorate($response, static fn(string $chunk): string => trim($chunk));
    }
}
// @doctest id="45e3"

Process SSE Payloads

use Cognesy\Http\Middleware\EventSource\EventSourceMiddleware;

$client = $client->withMiddleware(
    (new EventSourceMiddleware())
        ->withParser(static fn(string $payload): string|bool => $payload)
);
// @doctest id="b38e"
The parser runs on assembled SSE data: payloads.

Register Middleware

$client = $client->withMiddleware(new AddRequestIdMiddleware(), 'request-id');
$client = $client->withoutMiddleware('request-id');
// @doctest id="4eb1"
Both methods are immutable and return a new HttpClient instance.

See Also