HmacAuthMiddleware   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 4
Bugs 0 Features 1
Metric Value
eloc 20
dl 0
loc 73
ccs 22
cts 22
cp 1
rs 10
c 4
b 0
f 1
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A signRequest() 0 3 1
A __invoke() 0 23 3
A __construct() 0 5 1
1
<?php
2
3
namespace Acquia\Hmac\Guzzle;
4
5
use Acquia\Hmac\Exception\MalformedResponseException;
6
use Acquia\Hmac\KeyInterface;
7
use Acquia\Hmac\RequestSigner;
8
use Acquia\Hmac\ResponseAuthenticator;
9
use Psr\Http\Message\RequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
class HmacAuthMiddleware
13
{
14
    /**
15
     * @var \Acquia\Hmac\KeyInterface
16
     *  The key with which to sign requests and responses.
17
     */
18
    protected $key;
19
20
    /**
21
     * @var \Acquia\Hmac\RequestSignerInterface
22
     */
23
    protected $requestSigner;
24
25
    /**
26
     * @var array
27
     */
28
    protected $customHeaders = [];
29
30
    /**
31
     * @param \Acquia\Hmac\KeyInterface $key
32
     * @param string $realm
33
     * @param array $customHeaders
34
     */
35 5
    public function __construct(KeyInterface $key, $realm = 'Acquia', array $customHeaders = [])
36
    {
37 5
        $this->key = $key;
38 5
        $this->customHeaders = $customHeaders;
39 5
        $this->requestSigner = new RequestSigner($key, $realm);
40 5
    }
41
42
    /**
43
     * Called when the middleware is handled.
44
     *
45
     * @param callable $handler
46
     *
47
     * @return \Closure
48
     */
49
    public function __invoke(callable $handler)
50
    {
51 3
        return function ($request, array $options) use ($handler) {
52 3
            $request = $this->signRequest($request);
53
54 3
            $promise = function (ResponseInterface $response) use ($request) {
55 3
                if ($response->getStatusCode() != 401) {
56 3
                    $authenticator = new ResponseAuthenticator($request, $this->key);
57
58 3
                    if (!$authenticator->isAuthentic($response)) {
59 1
                        throw new MalformedResponseException(
60 1
                            'Could not verify the authenticity of the response.',
61 1
                            null,
62 1
                            0,
63 1
                            $response
64
                        );
65
                    }
66
                }
67
68 1
                return $response;
69 3
            };
70
71 3
            return $handler($request, $options)->then($promise);
72 3
        };
73
    }
74
75
    /**
76
     * Signs the request with the appropriate headers.
77
     *
78
     * @param \Psr\Http\Message\RequestInterface $request
79
     *
80
     * @return \Psr\Http\Message\RequestInterface
81
     */
82 5
    public function signRequest(RequestInterface $request)
83
    {
84 5
        return $this->requestSigner->signRequest($request, $this->customHeaders);
85
    }
86
}
87