ThrottleMiddleware   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 35
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 5
eloc 14
c 4
b 0
f 0
dl 0
loc 35
ccs 19
cts 19
cp 1
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __invoke() 0 3 1
A _requestHandler() 0 12 2
A handle() 0 5 1
A __construct() 0 3 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