2021-01-29 14:16:57 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Middlewares;
|
|
|
|
|
|
|
|
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
|
|
|
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
|
|
|
|
|
use GuzzleHttp\Psr7\Response;
|
2021-02-02 13:25:27 +01:00
|
|
|
use Slim\Exception\HttpForbiddenException;
|
2021-01-29 14:16:57 +01:00
|
|
|
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
|
|
|
|
|
{
|
2021-02-03 10:04:06 +01:00
|
|
|
$throttle = new LeakyBucket();
|
2025-02-17 10:29:38 +00:00
|
|
|
//! Enable APC in Laragon https://forum.laragon.org/topic/1245/regarding-caching-plugin-availability/4
|
|
|
|
|
$storage = new \Stiphle\Storage\Process();
|
|
|
|
|
$throttle->setStorage($storage);
|
2021-02-02 13:25:27 +01:00
|
|
|
// 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));
|
2021-01-29 14:16:57 +01:00
|
|
|
return $handler->handle($request);
|
|
|
|
|
}
|
|
|
|
|
}
|