Completed
Push — master ( ff5b0d...faa513 )
by Tobias
05:10 queued 02:50
created

HttpClientConfigurator::setApiCredentials()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 2
1
<?php
2
3
namespace Happyr\ApiClient;
4
5
use Http\Client\HttpClient;
6
use Http\Client\Common\PluginClient;
7
use Http\Discovery\HttpClientDiscovery;
8
use Http\Discovery\UriFactoryDiscovery;
9
use Http\Message\Authentication;
10
use Http\Message\UriFactory;
11
use Http\Client\Common\Plugin;
12
13
/**
14
 * Configure an HTTP client.
15
 *
16
 * @author Tobias Nyholm <[email protected]>
17
 *
18
 * @internal This class should not be used outside of the API Client, it is not part of the BC promise
19
 */
20
final class HttpClientConfigurator
21
{
22
    /**
23
     * @var string
24
     */
25
    private $endpoint = 'https://api.happyr.com';
26
27
    /**
28
     * @var string
29
     */
30
    private $apiUsername;
31
32
    /**
33
     * @var string
34
     */
35
    private $apiPassword;
36
37
    /**
38
     * @var UriFactory
39
     */
40
    private $uriFactory;
41
42
    /**
43
     * @var HttpClient
44
     */
45
    private $httpClient;
46
47
    /**
48
     * @var Plugin[]
49
     */
50
    private $prependPlugins = [];
51
52
    /**
53
     * @var Plugin[]
54
     */
55
    private $appendPlugins = [];
56
57
    /**
58
     * @param HttpClient|null $httpClient
59
     * @param UriFactory|null $uriFactory
60
     */
61
    public function __construct(HttpClient $httpClient = null, UriFactory $uriFactory = null)
62
    {
63
        $this->httpClient = $httpClient ?: HttpClientDiscovery::find();
64
        $this->uriFactory = $uriFactory ?: UriFactoryDiscovery::find();
65
    }
66
67
    /**
68
     * @return HttpClient
69
     */
70
    public function createConfiguredClient()
71
    {
72
        $plugins = $this->prependPlugins;
73
74
        $plugins[] = new Plugin\AddHostPlugin($this->uriFactory->createUri($this->endpoint));
75
        $plugins[] = new Plugin\HeaderDefaultsPlugin([
76
            'User-Agent' => 'Happyr/api-client (https://github.com/Happyr/php-api-client)',
77
        ]);
78
79
        if (null !== $this->apiUsername) {
80
            $plugins[] = new Plugin\AuthenticationPlugin(new Authentication\Wsse($this->apiUsername, $this->apiPassword));
81
        }
82
83
        return new PluginClient($this->httpClient, array_merge($plugins, $this->appendPlugins));
84
    }
85
86
    /**
87
     * @param string $endpoint
88
     *
89
     * @return HttpClientConfigurator
90
     */
91
    public function setEndpoint($endpoint)
92
    {
93
        $this->endpoint = $endpoint;
94
95
        return $this;
96
    }
97
98
    /**
99
     * @param string $username
100
     * @param string $password
101
     *
102
     * @return HttpClientConfigurator
103
     */
104
    public function setApiCredentials($username, $password)
105
    {
106
        $this->apiUsername = $username;
107
        $this->apiPassword = $password;
108
109
        return $this;
110
    }
111
112
    /**
113
     * @param Plugin $plugin
114
     *
115
     * @return HttpClientConfigurator
116
     */
117
    public function appendPlugin(Plugin ...$plugin)
118
    {
119
        foreach ($plugin as $p) {
120
            $this->appendPlugins[] = $p;
121
        }
122
123
        return $this;
124
    }
125
126
    /**
127
     * @param Plugin $plugin
128
     *
129
     * @return HttpClientConfigurator
130
     */
131
    public function prependPlugin(Plugin ...$plugin)
132
    {
133
        $plugin = array_reverse($plugin);
134
        foreach ($plugin as $p) {
135
            array_unshift($this->prependPlugins, $p);
136
        }
137
138
        return $this;
139
    }
140
}
141