Completed
Pull Request — master (#289)
by Gavin
16:24 queued 13:47
created

AbstractProxyClient   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 118
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 14.29%

Importance

Changes 6
Bugs 1 Features 2
Metric Value
wmc 12
c 6
b 1
f 2
lcom 1
cbo 6
dl 0
loc 118
ccs 4
cts 28
cp 0.1429
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
C __construct() 0 22 8
A flush() 0 4 1
A getDefaultOptions() 0 7 1
A queueRequest() 0 6 1
A escapeTags() 0 8 1
1
<?php
2
3
/*
4
 * This file is part of the FOSHttpCache package.
5
 *
6
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace FOS\HttpCache\ProxyClient;
13
14
use FOS\HttpCache\ProxyClient\Http\HttpAdapter;
15
use Http\Client\HttpAsyncClient;
16
use Http\Discovery\HttpAsyncClientDiscovery;
17
use Http\Discovery\MessageFactoryDiscovery;
18
use Http\Discovery\UriFactoryDiscovery;
19
use Http\Message\MessageFactory;
20
use Http\Message\UriFactory;
21
use Psr\Http\Message\UriInterface;
22
use Symfony\Component\OptionsResolver\OptionsResolver;
23
24
/**
25
 * Abstract HTTP based caching proxy client.
26
 *
27
 * @author David de Boer <[email protected]>
28
 */
29
abstract class AbstractProxyClient implements ProxyClientInterface
30
{
31
    /**
32
     * HTTP client adapter.
33
     *
34
     * @var HttpAdapter
35
     */
36
    protected $httpAdapter;
37
38
    /**
39
     * @var MessageFactory
40
     */
41
    protected $messageFactory;
42
43
    /**
44
     * The options configured in the constructor argument or default values.
45
     *
46
     * @var array The resolved options.
47
     */
48
    protected $options;
49
50
    /**
51
     * Constructor
52
     *
53
     * Supported options:
54
     *
55
     * - base_uri Default application hostname, optionally including base URL,
56
     *   for purge and refresh requests (optional). This is required if you
57
     *   purge and refresh paths instead of absolute URLs.
58
     *
59
     * @param array                $servers        Caching proxy server hostnames or IP
60
     *                                             addresses, including port if not port 80.
61
     *                                             E.g. ['127.0.0.1:6081']
62
     * @param array                $options        List of options for the client.
63
     * @param HttpAsyncClient|null $httpClient     Client capable of sending HTTP requests. If no
64
     *                                             client is supplied, a default one is created.
65
     * @param MessageFactory|null  $messageFactory Factory for PSR-7 messages. If none supplied,
66
     *                                             a default one is created.
67
     * @param UriFactory|null      $uriFactory     Factory for PSR-7 URIs. If not specified, a
68
     *                                             default one is created.
69
     */
70 8
    public function __construct(
71
        array $servers,
72
        array $options = [],
73
        HttpAsyncClient $httpClient = null,
74
        MessageFactory $messageFactory = null,
75
        UriFactory $uriFactory = null
76
    ) {
77 8
        if ((!$httpClient || !$messageFactory || !$uriFactory) && !class_exists('Http\Discovery\HttpAsyncClientDiscovery')) {
78
            throw new \LogicException('Either specify the client and the message and uri factories or include php-http/discovery in your project');
79
        }
80
81 8
        if (!$httpClient) {
82 8
            $httpClient = HttpAsyncClientDiscovery::find();
83
        }
84
        if (!$uriFactory) {
85
            $uriFactory = UriFactoryDiscovery::find();
86
        }
87
88
        $this->options = $this->getDefaultOptions()->resolve($options);
89
        $this->httpAdapter = new HttpAdapter($servers, $this->options['base_uri'], $httpClient, $uriFactory);
90
        $this->messageFactory = $messageFactory ?: MessageFactoryDiscovery::find();
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96
    public function flush()
97
    {
98
        return $this->httpAdapter->flush();
99
    }
100
101
    /**
102
     * Get options resolver with default settings.
103
     *
104
     * @return OptionsResolver
105
     */
106
    protected function getDefaultOptions()
107
    {
108
        $resolver = new OptionsResolver();
109
        $resolver->setDefaults(['base_uri' => null]);
110
111
        return $resolver;
112
    }
113
114
    /**
115
     * Create a request and queue it with the HttpAdapter.
116
     *
117
     * @param string              $method
118
     * @param string|UriInterface $url
119
     * @param array               $headers
120
     */
121
    protected function queueRequest($method, $url, array $headers)
122
    {
123
        $this->httpAdapter->invalidate(
124
            $this->messageFactory->createRequest($method, $url, $headers)
125
        );
126
    }
127
128
    /**
129
     * Make sure that the tags are valid.
130
     *
131
     * Reusable function for proxy clients.
132
     * Escapes `,` and `\n` (newline) characters.
133
     *
134
     * @param array $tags The tags to escape.
135
     *
136
     * @return array Sane tags.
137
     */
138
    protected function escapeTags(array $tags)
139
    {
140
        array_walk($tags, function (&$tag) {
141
            $tag = str_replace([',', "\n"], ['_', '_'], $tag);
142
        });
143
144
        return $tags;
145
    }
146
}
147