ThrottleMiddleware::__invoke()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
crap 1
1
<?php
2
3
namespace hamburgscleanest\GuzzleAdvancedThrottle\Middleware;
4
5
use hamburgscleanest\GuzzleAdvancedThrottle\RequestLimitRuleset;
6
use Psr\Http\Message\RequestInterface;
7
use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException;
8
9
class ThrottleMiddleware
10
{
11
    private RequestLimitRuleset $_requestLimitRuleset;
12
13 19
    public function __construct(RequestLimitRuleset $requestLimitRuleset)
14
    {
15 19
        $this->_requestLimitRuleset = $requestLimitRuleset;
16 19
    }
17
18 1
    public function __invoke(): callable
19
    {
20 1
        return $this->handle();
21
    }
22
23 19
    public function handle(): callable
24
    {
25 19
        return function(callable $handler): callable {
26 19
            return function(RequestInterface $request, array $options) use ($handler) {
27 19
                return $this->_requestLimitRuleset->cache($request, $this->_requestHandler($handler, $request, $options));
28 19
            };
29 19
        };
30
    }
31
32 19
    private function _requestHandler(callable $handler, RequestInterface $request, array $options): callable
33
    {
34 19
        return function() use ($handler, $request, $options) {
35 19
            $requestLimitGroup = $this->_requestLimitRuleset->getRequestLimitGroup();
36 19
            if (!$requestLimitGroup->canRequest($request, $options)) {
37 18
                throw new TooManyRequestsHttpException(
38 18
                    $requestLimitGroup->getRetryAfter(),
39 18
                    'The rate limit was exceeded. Please try again later.'
40
                );
41
            }
42
43 15
            return $handler($request, $options);
44 19
        };
45
    }
46
}
47