alexpts/psr15-middlewares

View on GitHub
src/ResponseTime.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
declare(strict_types=1);

namespace PTS\PSR15\Middlewares;


use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class ResponseTime implements MiddlewareInterface
{
    protected const HEADER = 'X-Response-Time';

    public function __invoke(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
    {
        return $this->process($request, $next);
    }

    public function process(ServerRequestInterface $request, RequestHandlerInterface $next) : ResponseInterface
    {
        $server = $request->getServerParams();
        $startTime = $server['REQUEST_TIME_FLOAT'] ?? microtime(true);

        $response = $next->handle($request);
        $diff = $this->getDiff($startTime);

        return $response->withHeader(self::HEADER, sprintf('%2.3fms', $diff));
    }

    protected function getDiff(float $startTime): float
    {
        return (microtime(true) - $startTime) * 1000;
    }
}