Completed
Push — master ( 7271c2...50c06c )
by Jorge
01:54
created

GuzzleMiddleware::__invoke()   B

Complexity

Conditions 4
Paths 2

Size

Total Lines 22
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 4

Importance

Changes 0
Metric Value
cc 4
eloc 14
nc 2
nop 2
dl 0
loc 22
rs 8.9197
c 0
b 0
f 0
ccs 14
cts 14
cp 1
crap 4
1
<?php
2
3
namespace JVelasco\CircuitBreaker\Adapters;
4
5
use GuzzleHttp\Promise\Promise;
6
use GuzzleHttp\Promise\PromiseInterface;
7
use GuzzleHttp\Psr7\Response;
8
use JVelasco\CircuitBreaker\CircuitBreaker;
9
use Psr\Http\Message\RequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
class GuzzleMiddleware
13
{
14
    private $circuitBreaker;
15
    private $handler;
16
17 4
    public function __construct(CircuitBreaker $circuitBreaker, callable $handler)
18
    {
19 4
        $this->circuitBreaker = $circuitBreaker;
20 4
        $this->handler = $handler;
21 4
    }
22
23 4
    public function __invoke(RequestInterface $request, array $options): PromiseInterface
24
    {
25 4
        $serviceName = implode("_", [
26 4
            $request->getUri()->getHost(),
27 4
            $request->getUri()->getPort()
28
        ]);
29
        /** @var Promise $promise */
30 4
        $promise = ($this->handler)($request, $options);
31 4
        if (!$this->circuitBreaker->isAvailable($serviceName)) {
32 1
            $promise->resolve($this->openCircuitResponse($serviceName));
33 1
            return $promise;
34
        }
35
36 3
        return $promise->then(function (ResponseInterface $response) use ($serviceName) {
37 3
            $wasSuccessful = $response->getStatusCode() >= 200 && $response->getStatusCode() < 300;
38 3
            if ($wasSuccessful) {
39 2
                $this->circuitBreaker->reportSuccess($serviceName);
40
            } else {
41 1
                $this->circuitBreaker->reportFailure($serviceName);
42
            }
43
44 3
            return $response;
45 3
        });
46
    }
47
48 1
    private function openCircuitResponse(string $serviceName): Response
49
    {
50 1
        $reasonPhrase = sprintf("Circuit for service %s is open", $serviceName);
51 1
        return (new Response())
52 1
            ->withStatus(503, $reasonPhrase);
53
    }
54
}
55