ldc-pfcgen/app/Middlewares/ThrottleMiddleware.php
2025-02-17 10:29:38 +00:00

35 lines
1.2 KiB
PHP

<?php
namespace App\Middlewares;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use GuzzleHttp\Psr7\Response;
use Slim\Exception\HttpForbiddenException;
use Stiphle\Throttle\LeakyBucket;
class ThrottleMiddleware
{
/**
* Example middleware invokable class
*
* @param ServerRequest $request PSR-7 request
* @param RequestHandler $handler PSR-15 request handler
*
* @return Response
*/
public function __invoke(Request $request, RequestHandler $handler): Response
{
$throttle = new LeakyBucket();
//! Enable APC in Laragon https://forum.laragon.org/topic/1245/regarding-caching-plugin-availability/4
$storage = new \Stiphle\Storage\Process();
$throttle->setStorage($storage);
// limit to 1 per second by default
$estimate = $throttle->getEstimate('api.request', env('RequestLimit', 1), env('RequestLimitTimeout', 1000));
if ($estimate > 1000) {
throw new HttpForbiddenException($request, 'Too many requests');
}
$throttle->throttle('api.request', env('RequestLimit', 1), env('RequestLimitTimeout', 1000));
return $handler->handle($request);
}
}