Passed
Push — master ( 43d9b3...bd5a56 )
by Timo
02:54
created

ThrottleMiddleware::__invoke()   A

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
/**
10
 * Class ThrottleMiddleware
11
 * @package hamburgscleanest\GuzzleAdvancedThrottle\Middleware
12
 */
13
class ThrottleMiddleware
14
{
15
16
    /** @var RequestLimitRuleset */
17
    private $_requestLimitRuleset;
18
19
    /**
20
     * ThrottleMiddleware constructor.
21
     * @param RequestLimitRuleset $requestLimitRuleset
22
     */
23 16
    public function __construct(RequestLimitRuleset $requestLimitRuleset)
24
    {
25 16
        $this->_requestLimitRuleset = $requestLimitRuleset;
26 16
    }
27
28
    /**
29
     * @return callable
30
     */
31 1
    public function __invoke() : callable
32
    {
33 1
        return $this->handle();
34
    }
35
36
    /**
37
     * @return callable
38
     * @throws \Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
39
     * @throws \Exception
40
     */
41 16
    public function handle() : callable
42
    {
43
        return function(callable $handler) : callable
44
        {
45
            return function(RequestInterface $request, array $options) use ($handler)
46
            {
47 16
                return $this->_requestLimitRuleset->cache($request, $this->_requestHandler($handler, $request, $options));
48 16
            };
49 16
        };
50
    }
51
52
    /**
53
     * @param callable $handler
54
     * @param RequestInterface $request
55
     * @param array $options
56
     * @return callable
57
     * @throws \Exception
58
     */
59 16
    private function _requestHandler(callable $handler, RequestInterface $request, array $options) : callable
60
    {
61
        return function() use ($handler, $request, $options)
62
        {
63 16
            $requestLimitGroup = $this->_requestLimitRuleset->getRequestLimitGroup();
64 16
            if (!$requestLimitGroup->canRequest($request, $options))
65
            {
66 15
                throw new TooManyRequestsHttpException(
67 15
                    $requestLimitGroup->getRetryAfter(),
68 15
                    'The rate limit was exceeded. Please try again later.'
69
                );
70
            }
71
72 12
            return $handler($request, $options);
73 16
        };
74
    }
75
}