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

GuzzleMiddleware   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 41
rs 10
c 0
b 0
f 0
ccs 23
cts 23
cp 1
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A openCircuitResponse() 0 5 1
A __construct() 0 4 1
B __invoke() 0 22 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