ClientFactory   A
last analyzed

Complexity

Total Complexity 4

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 4
lcom 1
cbo 4
dl 0
loc 65
ccs 18
cts 18
cp 1
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 2
A createClient() 0 18 2
1
<?php
2
3
namespace TreeHouse\Keystone\Client;
4
5
use GuzzleHttp\Client as GuzzleClient;
6
use GuzzleHttp\ClientInterface;
7
use GuzzleHttp\Exception\RequestException;
8
use GuzzleHttp\HandlerStack;
9
use Psr\Log\LoggerInterface;
10
use TreeHouse\Cache\CacheInterface;
11
use TreeHouse\Keystone\Client\Middleware\Middleware;
12
use TreeHouse\Keystone\Client\Model\Tenant;
13
14
/**
15
 * Factory service to create a Guzzle client with Keystone authentication
16
 * support. This factory also deals with expiring tokens, by automatically
17
 * re-authenticating.
18
 *
19
 * Usage:
20
 *
21
 * ```
22
 * $tenant = new Tenant($tokenUrl, $username, $password, $serviceType);
23
 * $client = $factory->createClient($tenant);
24
 * ```
25
 */
26
class ClientFactory
27
{
28
    /**
29
     * The cache where tokens are stored.
30
     *
31
     * @var CacheInterface
32
     */
33
    protected $cache;
34
35
    /**
36
     * The class to construct a Guzzle client with.
37
     *
38
     * @var string
39
     */
40
    protected $clientClass;
41
42
    /**
43
     * Optional logger.
44
     *
45
     * @var LoggerInterface
46
     */
47
    protected $logger;
48
49
    /**
50
     * @param CacheInterface  $cache
51
     * @param string          $class
52
     * @param LoggerInterface $logger
53
     */
54 10
    public function __construct(CacheInterface $cache, $class = null, LoggerInterface $logger = null)
55
    {
56 10
        $this->cache = $cache;
57 10
        $this->clientClass = $class ?: GuzzleClient::class;
58 10
        $this->logger = $logger;
59 10
    }
60
61
    /**
62
     * Creates a Guzzle client for communicating with a Keystone service.
63
     *
64
     * @param Tenant $tenant The keystone tenant to authenticate with
65
     * @param array  $config The client configuration
66
     * @param string $class  Optionally override the Guzzle client class
67
     *
68
     * @throws RequestException When a new token could not be requested.
69
     *
70
     * @return ClientInterface
71
     */
72 9
    public function createClient(Tenant $tenant, array $config = [], $class = null)
73
    {
74 9
        if (null === $class) {
75 9
            $class = $this->clientClass;
76 9
        }
77
78 9
        $pool = new TokenPool($tenant, $this->cache, $this->logger);
79 9
        $signer = new RequestSigner($pool);
80
81 9
        $stack = HandlerStack::create();
82 9
        $stack->before('http_errors', Middleware::signRequest($signer), 'signer');
83 9
        $stack->before('http_errors', Middleware::reauthenticate($signer), 'reauth');
84
85 9
        return new $class(array_merge($config, [
86 9
            'handler' => $stack,
87 9
            'token_pool' => $pool,
88 9
        ]));
89
    }
90
}
91