Completed
Push — master ( 32a55a...fb9711 )
by Mitchel
02:18
created

HttpClientFactory::createBaseClient()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
c 0
b 0
f 0
rs 9.4285
cc 1
eloc 8
nc 1
nop 2
1
<?php
2
3
namespace Bunq;
4
5
use Bunq\Certificate\CertificateType;
6
use Bunq\Certificate\Storage\CertificateStorage;
7
use Bunq\Middleware\RequestAuthenticationMiddleware;
8
use Bunq\Middleware\RequestIdMiddleware;
9
use Bunq\Middleware\RequestSignatureMiddleware;
10
use Bunq\Middleware\ResponseSignatureMiddleware;
11
use Bunq\Service\TokenService;
12
use GuzzleHttp\ClientInterface;
13
use GuzzleHttp\HandlerStack;
14
use GuzzleHttp\Middleware;
15
16
final class HttpClientFactory
17
{
18
    /**
19
     * Creates an installation client
20
     *
21
     * @param string             $url
22
     * @param CertificateStorage $certificateStorage
23
     *
24
     * @return ClientInterface
25
     */
26
    public static function createInstallationClient($url, CertificateStorage $certificateStorage)
27
    {
28
        $handlerStack = HandlerStack::create();
29
        $handlerStack->push(
30
            Middleware::mapRequest(new RequestIdMiddleware())
31
        );
32
        $handlerStack->push(
33
            Middleware::mapRequest(new RequestSignatureMiddleware($certificateStorage->load(CertificateType::PRIVATE_KEY())))
34
        );
35
36
        return self::createBaseClient((string)$url, $handlerStack);
37
    }
38
39
    /**
40
     * Creates the HttpClient with all handlers
41
     *
42
     * @param string             $url
43
     * @param TokenService       $tokenService
44
     * @param CertificateStorage $certificateStorage
45
     *
46
     * @return ClientInterface
47
     */
48
    public static function create($url, TokenService $tokenService, CertificateStorage $certificateStorage)
49
    {
50
        $sessionToken    = $tokenService->sessionToken();
51
        $publicServerKey = $certificateStorage->load(CertificateType::BUNQ_SERVER_KEY());
52
53
        $handlerStack = HandlerStack::create();
54
        $handlerStack->push(
55
            Middleware::mapRequest(new RequestIdMiddleware())
56
        );
57
        $handlerStack->push(
58
            Middleware::mapRequest(new RequestAuthenticationMiddleware($sessionToken))
59
        );
60
        $handlerStack->push(
61
            Middleware::mapRequest(new RequestSignatureMiddleware($certificateStorage->load(CertificateType::PRIVATE_KEY())))
62
        );
63
        $handlerStack->push(
64
            Middleware::mapResponse(new ResponseSignatureMiddleware($publicServerKey))
65
        );
66
67
        $httpClient = self::createBaseClient($url, $handlerStack);
68
69
        return $httpClient;
70
    }
71
72
    /**
73
     * Returns the standard used headers.
74
     *
75
     * @param string            $url
76
     * @param HandlerStack|null $handlerStack
77
     *
78
     * @return ClientInterface
79
     */
80
    private static function createBaseClient($url, HandlerStack $handlerStack = null)
81
    {
82
        $httpClient = new \GuzzleHttp\Client(
83
            [
84
                'base_uri' => $url,
85
                'handler'  => $handlerStack,
86
                'headers'  => [
87
                    'Content-Type' => 'application/json',
88
                    'User-Agent'   => 'bunq-api-client:user',
89
                ],
90
            ]
91
        );
92
93
        return $httpClient;
94
    }
95
}
96