Completed
Pull Request — master (#376)
by Geoffrey
02:35
created

FOSHttpCacheExtension   D

Complexity

Total Complexity 86

Size/Duplication

Total Lines 529
Duplicated Lines 2.27 %

Coupling/Cohesion

Components 1
Dependencies 10

Test Coverage

Coverage 90.37%

Importance

Changes 0
Metric Value
wmc 86
c 0
b 0
f 0
lcom 1
cbo 10
dl 12
loc 529
ccs 244
cts 270
cp 0.9037
rs 4.8717

24 Methods

Rating   Name   Duplication   Size   Complexity  
A loadCacheControl() 0 14 3
A getConfiguration() 0 4 1
F load() 0 93 21
A loadCacheable() 0 15 2
A parseRuleMatcher() 0 20 2
B loadProxyClient() 0 20 5
B createHttpDispatcherDefinition() 0 24 4
A loadVarnish() 0 16 3
A loadNginx() 0 8 1
A loadSymfony() 0 5 1
B loadCacheTagging() 0 27 6
A loadTest() 0 8 2
A loadProxyServer() 0 15 3
A loadVarnishProxyServer() 0 10 2
A loadNginxProxyServer() 0 10 2
A loadTagRules() 0 15 2
A loadInvalidatorRules() 0 9 2
A validateUrl() 0 8 2
A prefixSchema() 0 8 2
B getDefaultProxyClient() 0 24 6
A createChildDefinition() 0 8 2
B parseRequestMatcher() 0 27 4
B parseResponseMatcher() 12 24 5
B loadUserContext() 0 34 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like FOSHttpCacheExtension often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use FOSHttpCacheExtension, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/*
4
 * This file is part of the FOSHttpCacheBundle 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\HttpCacheBundle\DependencyInjection;
13
14
use FOS\HttpCache\ProxyClient\HttpDispatcher;
15
use FOS\HttpCacheBundle\DependencyInjection\Compiler\HashGeneratorPass;
16
use FOS\HttpCacheBundle\Http\ResponseMatcher\ExpressionResponseMatcher;
17
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
18
use Symfony\Component\Config\FileLocator;
19
use Symfony\Component\DependencyInjection\ChildDefinition;
20
use Symfony\Component\DependencyInjection\ContainerBuilder;
21
use Symfony\Component\DependencyInjection\Definition;
22
use Symfony\Component\DependencyInjection\DefinitionDecorator;
23
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
24
use Symfony\Component\DependencyInjection\Reference;
25
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
26
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
27
28
/**
29
 * {@inheritdoc}
30
 */
31
class FOSHttpCacheExtension extends Extension
32
{
33
    /**
34
     * {@inheritdoc}
35
     */
36 26
    public function getConfiguration(array $config, ContainerBuilder $container)
37
    {
38 26
        return new Configuration($container->getParameter('kernel.debug'));
39
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44 26
    public function load(array $configs, ContainerBuilder $container)
45
    {
46 26
        $configuration = $this->getConfiguration($configs, $container);
47 26
        $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Bug introduced by
It seems like $configuration defined by $this->getConfiguration($configs, $container) on line 46 can be null; however, Symfony\Component\Depend...:processConfiguration() does not accept null, maybe add an additional type check?

Unless you are absolutely sure that the expression can never be null because of other conditions, we strongly recommend to add an additional type check to your code:

/** @return stdClass|null */
function mayReturnNull() { }

function doesNotAcceptNull(stdClass $x) { }

// With potential error.
function withoutCheck() {
    $x = mayReturnNull();
    doesNotAcceptNull($x); // Potential error here.
}

// Safe - Alternative 1
function withCheck1() {
    $x = mayReturnNull();
    if ( ! $x instanceof stdClass) {
        throw new \LogicException('$x must be defined.');
    }
    doesNotAcceptNull($x);
}

// Safe - Alternative 2
function withCheck2() {
    $x = mayReturnNull();
    if ($x instanceof stdClass) {
        doesNotAcceptNull($x);
    }
}
Loading history...
48
49 26
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
50 26
        $loader->load('matcher.xml');
51
52 26
        if ($config['debug']['enabled'] || (!empty($config['cache_control']))) {
53 6
            $debugHeader = $config['debug']['enabled'] ? $config['debug']['header'] : false;
54 6
            $container->setParameter($this->getAlias().'.debug_header', $debugHeader);
55 6
            $loader->load('cache_control_listener.xml');
56
        }
57
58 26
        $this->loadCacheable($container, $config['cacheable']);
59
60 26
        if (!empty($config['cache_control'])) {
61 6
            $this->loadCacheControl($container, $config['cache_control']);
62
        }
63
64 25
        if (isset($config['proxy_client'])) {
65 17
            $this->loadProxyClient($container, $loader, $config['proxy_client']);
66
        }
67
68 24
        if (isset($config['test'])) {
69 1
            $this->loadTest($container, $loader, $config['test']);
70
        }
71
72 24
        if ($config['cache_manager']['enabled']) {
73 17
            if (array_key_exists('custom_proxy_client', $config['cache_manager'])) {
74
                // overwrite the previously set alias, if a proxy client was also configured
75 1
                $container->setAlias(
76 1
                    $this->getAlias().'.default_proxy_client',
77 1
                    $config['cache_manager']['custom_proxy_client']
78
                );
79
            }
80 17
            if ('auto' === $config['cache_manager']['generate_url_type']) {
81 17
                if (array_key_exists('custom_proxy_client', $config['cache_manager'])) {
82 1
                    $generateUrlType = UrlGeneratorInterface::ABSOLUTE_URL;
83
                } else {
84 16
                    $defaultClient = $this->getDefaultProxyClient($config['proxy_client']);
85 16
                    if ($defaultClient !== 'noop'
86 16
                        && array_key_exists('base_url', $config['proxy_client'][$defaultClient])) {
87
                        $generateUrlType = UrlGeneratorInterface::ABSOLUTE_PATH;
88
                    } else {
89 17
                        $generateUrlType = UrlGeneratorInterface::ABSOLUTE_URL;
90
                    }
91
                }
92
            } else {
93
                $generateUrlType = $config['cache_manager']['generate_url_type'];
94
            }
95 17
            $container->setParameter($this->getAlias().'.cache_manager.generate_url_type', $generateUrlType);
96 17
            $loader->load('cache_manager.xml');
97
        }
98
99 24
        if ($config['tags']['enabled']) {
100 17
            $this->loadCacheTagging(
101 17
                $container,
102 17
                $loader,
103 17
                $config['tags'],
104 17
                array_key_exists('proxy_client', $config)
105 16
                    ? $this->getDefaultProxyClient($config['proxy_client'])
106 17
                    : 'custom'
107
            );
108
        } else {
109 7
            $container->setParameter($this->getAlias().'.compiler_pass.tag_annotations', false);
110
        }
111
112 23
        if ($config['invalidation']['enabled']) {
113 16
            $loader->load('invalidation_listener.xml');
114
115 16
            if (!empty($config['invalidation']['expression_language'])) {
116
                $container->setAlias(
117
                    $this->getAlias().'.invalidation.expression_language',
118
                    $config['invalidation']['expression_language']
119
                );
120
            }
121
122 16
            if (!empty($config['invalidation']['rules'])) {
123 2
                $this->loadInvalidatorRules($container, $config['invalidation']['rules']);
124
            }
125
        }
126
127 23
        if ($config['user_context']['enabled']) {
128 4
            $this->loadUserContext($container, $loader, $config['user_context']);
129
        }
130
131 23
        if (!empty($config['flash_message']) && $config['flash_message']['enabled']) {
132 1
            $container->setParameter($this->getAlias().'.event_listener.flash_message.options', $config['flash_message']);
133
134 1
            $loader->load('flash_message.xml');
135
        }
136 23
    }
137
138 26
    private function loadCacheable(ContainerBuilder $container, array $config)
139
    {
140 26
        $definition = $container->getDefinition($this->getAlias().'.response_matcher.cacheable');
141
142
        // Change CacheableResponseMatcher to ExpressionResponseMatcher
143 26
        if ($config['response']['expression']) {
144
            $definition->setClass(ExpressionResponseMatcher::class)
145
                ->setArguments([$config['response']['expression']]);
146
        } else {
147 26
            $container->setParameter(
148 26
                $this->getAlias().'.cacheable.response.additional_status',
149 26
                $config['response']['additional_status']
150
            );
151
        }
152 26
    }
153
154
    /**
155
     * @param ContainerBuilder $container
156
     * @param array            $config
157
     *
158
     * @throws InvalidConfigurationException
159
     */
160 6
    private function loadCacheControl(ContainerBuilder $container, array $config)
161
    {
162 6
        $controlDefinition = $container->getDefinition($this->getAlias().'.event_listener.cache_control');
163
164 6
        foreach ($config['rules'] as $rule) {
165 6
            $ruleMatcher = $this->parseRuleMatcher($container, $rule['match']);
166
167 6
            if ('default' === $rule['headers']['overwrite']) {
168 6
                $rule['headers']['overwrite'] = $config['defaults']['overwrite'];
169
            }
170
171 6
            $controlDefinition->addMethodCall('addRule', [$ruleMatcher, $rule['headers']]);
172
        }
173 5
    }
174
175
    /**
176
     * Parse one cache control rule match configuration.
177
     *
178
     * @param ContainerBuilder $container
179
     * @param array            $match     Request and response match criteria
180
     *
181
     * @return Reference pointing to a rule matcher service
182
     */
183 6
    private function parseRuleMatcher(ContainerBuilder $container, array $match)
184
    {
185 6
        $requestMatcher = $this->parseRequestMatcher($container, $match);
186 6
        $responseMatcher = $this->parseResponseMatcher($container, $match);
187
188 6
        $signature = serialize([(string) $requestMatcher, (string) $responseMatcher]);
189 6
        $id = $this->getAlias().'.cache_control.rule_matcher.'.md5($signature);
190
191 6
        if ($container->hasDefinition($id)) {
192 1
            throw new InvalidConfigurationException('Duplicate match criteria. Would be hidden by a previous rule. match: '.json_encode($match));
193
        }
194
195
        $container
196 6
            ->setDefinition($id, $this->createChildDefinition($this->getAlias().'.rule_matcher'))
197 6
            ->replaceArgument(0, $requestMatcher)
198 6
            ->replaceArgument(1, $responseMatcher)
199
        ;
200
201 6
        return new Reference($id);
202
    }
203
204
    /**
205
     * Used for cache control, tag and invalidation rules.
206
     *
207
     * @param ContainerBuilder $container
208
     * @param array            $match
209
     *
210
     * @return Reference to the request matcher
211
     */
212 8
    private function parseRequestMatcher(ContainerBuilder $container, array $match)
213
    {
214 8
        $match['ips'] = (empty($match['ips'])) ? null : $match['ips'];
215
216
        $arguments = [
217 8
            $match['path'],
218 8
            $match['host'],
219 8
            $match['methods'],
220 8
            $match['ips'],
221 8
            $match['attributes'],
222
        ];
223 8
        $serialized = serialize($arguments);
224 8
        $id = $this->getAlias().'.request_matcher.'.md5($serialized).sha1($serialized);
225
226 8
        if (!$container->hasDefinition($id)) {
227
            $container
228 8
                ->setDefinition($id, $this->createChildDefinition($this->getAlias().'.request_matcher'))
229 8
                ->setArguments($arguments)
230
            ;
231
232 8
            if (!empty($match['query_string'])) {
233
                $container->getDefinition($id)->addMethodCall('setQueryString', [$match['query_string']]);
234
            }
235
        }
236
237 8
        return new Reference($id);
238
    }
239
240
    /**
241
     * Used only for cache control rules.
242
     *
243
     * @param ContainerBuilder $container
244
     * @param array            $config
245
     *
246
     * @return Reference to the correct response matcher service
247
     */
248 6
    private function parseResponseMatcher(ContainerBuilder $container, array $config)
249
    {
250 6
        if (!empty($config['additional_response_status'])) {
251 1
            $id = $this->getAlias().'cache_control.expression.'.md5(serialize($config['additional_response_status']));
252 1 View Code Duplication
            if (!$container->hasDefinition($id)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
253
                $container
254 1
                    ->setDefinition($id, $this->createChildDefinition($this->getAlias().'.response_matcher.cache_control.cacheable_response'))
255 1
                    ->setArguments([$config['additional_response_status']])
256
                ;
257
            }
258 5
        } elseif (!empty($config['match_response'])) {
259 2
            $id = $this->getAlias().'cache_control.match_response.'.md5($config['match_response']);
260 2 View Code Duplication
            if (!$container->hasDefinition($id)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
261
                $container
262 2
                    ->setDefinition($id, $this->createChildDefinition($this->getAlias().'.response_matcher.cache_control.expression'))
263 2
                    ->replaceArgument(0, $config['match_response'])
264
                ;
265
            }
266
        } else {
267 3
            $id = $this->getAlias().'.response_matcher.cacheable';
268
        }
269
270 6
        return new Reference($id);
271
    }
272
273 4
    private function loadUserContext(ContainerBuilder $container, XmlFileLoader $loader, array $config)
274
    {
275 4
        $loader->load('user_context.xml');
276
277 4
        $container->getDefinition($this->getAlias().'.user_context.request_matcher')
278 4
            ->replaceArgument(0, $config['match']['accept'])
279 4
            ->replaceArgument(1, $config['match']['method']);
280
281 4
        $container->setParameter($this->getAlias().'.event_listener.user_context.options', [
282 4
            'user_identifier_headers' => $config['user_identifier_headers'],
283 4
            'user_hash_header' => $config['user_hash_header'],
284 4
            'ttl' => $config['hash_cache_ttl'],
285 4
            'add_vary_on_hash' => $config['always_vary_on_context_hash'],
286
        ]);
287 4
        $container->getDefinition($this->getAlias().'.event_listener.user_context')
288 4
            ->replaceArgument(0, new Reference($config['match']['matcher_service']));
289
290 4
        $container->getDefinition($this->getAlias().'.user_context.anonymous_request_matcher')
291 4
            ->replaceArgument(0, $config['user_identifier_headers']);
292
293 4
        if ($config['logout_handler']['enabled']) {
294 4
            $container->getDefinition($this->getAlias().'.user_context.logout_handler')
295 4
                ->replaceArgument(1, $config['user_identifier_headers'])
296 4
                ->replaceArgument(2, $config['match']['accept']);
297
        } else {
298
            $container->removeDefinition($this->getAlias().'.user_context.logout_handler');
299
        }
300
301 4
        if ($config['role_provider']) {
302 2
            $container->getDefinition($this->getAlias().'.user_context.role_provider')
303 2
                ->addTag(HashGeneratorPass::TAG_NAME)
304 2
                ->setAbstract(false);
305
        }
306 4
    }
307
308 17
    private function loadProxyClient(ContainerBuilder $container, XmlFileLoader $loader, array $config)
309
    {
310 17
        if (isset($config['varnish'])) {
311 13
            $this->loadVarnish($container, $loader, $config['varnish']);
312
        }
313 16
        if (isset($config['nginx'])) {
314 2
            $this->loadNginx($container, $loader, $config['nginx']);
315
        }
316 16
        if (isset($config['symfony'])) {
317 1
            $this->loadSymfony($container, $loader, $config['symfony']);
318
        }
319 16
        if (isset($config['noop'])) {
320 1
            $loader->load('noop.xml');
321
        }
322
323 16
        $container->setAlias(
324 16
            $this->getAlias().'.default_proxy_client',
325 16
            $this->getAlias().'.proxy_client.'.$this->getDefaultProxyClient($config)
326
        );
327 16
    }
328
329
    /**
330
     * Define the http dispatcher service for the proxy client $name.
331
     *
332
     * @param ContainerBuilder $container
333
     * @param array            $config
334
     * @param string           $serviceName
335
     */
336 16
    private function createHttpDispatcherDefinition(ContainerBuilder $container, array $config, $serviceName)
337
    {
338 16
        foreach ($config['servers'] as $url) {
339 16
            $this->validateUrl($url, 'Not a valid Varnish server address: "%s"');
340
        }
341 16
        if (!empty($config['base_url'])) {
342 16
            $baseUrl = $this->prefixSchema($config['base_url']);
343 16
            $this->validateUrl($baseUrl, 'Not a valid base path: "%s"');
344
        } else {
345
            $baseUrl = null;
346
        }
347 15
        $httpClient = null;
348 15
        if ($config['http_client']) {
349 1
            $httpClient = new Reference($config['http_client']);
350
        }
351
352 15
        $definition = new Definition(HttpDispatcher::class, [
353 15
            $config['servers'],
354 15
            $baseUrl,
355 15
            $httpClient,
356
        ]);
357
358 15
        $container->setDefinition($serviceName, $definition);
359 15
    }
360
361 13
    private function loadVarnish(ContainerBuilder $container, XmlFileLoader $loader, array $config)
362
    {
363 13
        $this->createHttpDispatcherDefinition($container, $config['http'], $this->getAlias().'.proxy_client.varnish.http_dispatcher');
364
        $options = [
365 12
            'tags_header' => $config['tags_header'],
366
        ];
367 12
        if (!empty($config['header_length'])) {
368
            $options['header_length'] = $config['header_length'];
369
        }
370 12
        if (!empty($config['default_ban_headers'])) {
371
            $options['default_ban_headers'] = $config['default_ban_headers'];
372
        }
373 12
        $container->setParameter($this->getAlias().'.proxy_client.varnish.options', $options);
374
375 12
        $loader->load('varnish.xml');
376 12
    }
377
378 2
    private function loadNginx(ContainerBuilder $container, XmlFileLoader $loader, array $config)
379
    {
380 2
        $this->createHttpDispatcherDefinition($container, $config['http'], $this->getAlias().'.proxy_client.nginx.http_dispatcher');
381 2
        $container->setParameter($this->getAlias().'.proxy_client.nginx.options', [
382 2
            'purge_location' => $config['purge_location'],
383
        ]);
384 2
        $loader->load('nginx.xml');
385 2
    }
386
387 1
    private function loadSymfony(ContainerBuilder $container, XmlFileLoader $loader, array $config)
388
    {
389 1
        $this->createHttpDispatcherDefinition($container, $config['http'], $this->getAlias().'.proxy_client.symfony.http_dispatcher');
390 1
        $loader->load('symfony.xml');
391 1
    }
392
393
    /**
394
     * @param ContainerBuilder $container
395
     * @param XmlFileLoader    $loader
396
     * @param array            $config    Configuration section for the tags node
397
     * @param string           $client    Name of the client used with the cache manager,
398
     *                                    "custom" when a custom client is used
399
     */
400 17
    private function loadCacheTagging(ContainerBuilder $container, XmlFileLoader $loader, array $config, $client)
401
    {
402 17
        if ('auto' === $config['enabled'] && 'varnish' !== $client) {
403 4
            $container->setParameter($this->getAlias().'.compiler_pass.tag_annotations', false);
404
405 4
            return;
406
        }
407 13
        if (!in_array($client, ['varnish', 'custom', 'noop'])) {
408 1
            throw new InvalidConfigurationException(sprintf('You can not enable cache tagging with the %s client', $client));
409
        }
410
411 12
        $container->setParameter($this->getAlias().'.compiler_pass.tag_annotations', true);
412 12
        $container->setParameter($this->getAlias().'.tag_handler.response_header', $config['response_header']);
413 12
        $container->setParameter($this->getAlias().'.tag_handler.strict', $config['strict']);
414 12
        $loader->load('cache_tagging.xml');
415
416 12
        if (!empty($config['expression_language'])) {
417
            $container->setAlias(
418
                $this->getAlias().'.tag_handler.expression_language',
419
                $config['expression_language']
420
            );
421
        }
422
423 12
        if (!empty($config['rules'])) {
424 2
            $this->loadTagRules($container, $config['rules']);
425
        }
426 12
    }
427
428 1
    private function loadTest(ContainerBuilder $container, XmlFileLoader $loader, array $config)
429
    {
430 1
        $container->setParameter($this->getAlias().'.test.cache_header', $config['cache_header']);
431
432 1
        if ($config['proxy_server']) {
433 1
            $this->loadProxyServer($container, $loader, $config['proxy_server']);
434
        }
435 1
    }
436
437 1
    private function loadProxyServer(ContainerBuilder $container, XmlFileLoader $loader, array $config)
438
    {
439 1
        if (isset($config['varnish'])) {
440 1
            $this->loadVarnishProxyServer($container, $loader, $config['varnish']);
441
        }
442
443 1
        if (isset($config['nginx'])) {
444
            $this->loadNginxProxyServer($container, $loader, $config['varnish']);
445
        }
446
447 1
        $container->setAlias(
448 1
            $this->getAlias().'.test.default_proxy_server',
449 1
            $this->getAlias().'.test.proxy_server.'.$this->getDefaultProxyClient($config)
450
        );
451 1
    }
452
453 1
    private function loadVarnishProxyServer(ContainerBuilder $container, XmlFileLoader $loader, $config)
454
    {
455 1
        $loader->load('varnish_proxy.xml');
456 1
        foreach ($config as $key => $value) {
457 1
            $container->setParameter(
458 1
                $this->getAlias().'.test.proxy_server.varnish.'.$key,
459 1
                $value
460
            );
461
        }
462 1
    }
463
464
    private function loadNginxProxyServer(ContainerBuilder $container, XmlFileLoader $loader, $config)
465
    {
466
        $loader->load('nginx_proxy.xml');
467
        foreach ($config as $key => $value) {
468
            $container->setParameter(
469
                $this->getAlias().'.test.proxy_server.nginx.'.$key,
470
                $value
471
            );
472
        }
473
    }
474
475 2
    private function loadTagRules(ContainerBuilder $container, array $config)
476
    {
477 2
        $tagDefinition = $container->getDefinition($this->getAlias().'.event_listener.tag');
478
479 2
        foreach ($config as $rule) {
480 2
            $ruleMatcher = $this->parseRequestMatcher($container, $rule['match']);
481
482
            $tags = [
483 2
                'tags' => $rule['tags'],
484 2
                'expressions' => $rule['tag_expressions'],
485
            ];
486
487 2
            $tagDefinition->addMethodCall('addRule', [$ruleMatcher, $tags]);
488
        }
489 2
    }
490
491 2
    private function loadInvalidatorRules(ContainerBuilder $container, array $config)
492
    {
493 2
        $tagDefinition = $container->getDefinition($this->getAlias().'.event_listener.invalidation');
494
495 2
        foreach ($config as $rule) {
496 2
            $ruleMatcher = $this->parseRequestMatcher($container, $rule['match']);
497 2
            $tagDefinition->addMethodCall('addRule', [$ruleMatcher, $rule['routes']]);
498
        }
499 2
    }
500
501 16
    private function validateUrl($url, $msg)
502
    {
503 16
        $prefixed = $this->prefixSchema($url);
504
505 16
        if (!$parts = parse_url($prefixed)) {
506 1
            throw new InvalidConfigurationException(sprintf($msg, $url));
507
        }
508 16
    }
509
510 16
    private function prefixSchema($url)
511
    {
512 16
        if (false === strpos($url, '://')) {
513 16
            $url = sprintf('%s://%s', 'http', $url);
514
        }
515
516 16
        return $url;
517
    }
518
519 16
    private function getDefaultProxyClient(array $config)
520
    {
521 16
        if (isset($config['default'])) {
522
            return $config['default'];
523
        }
524
525 16
        if (isset($config['varnish'])) {
526 12
            return 'varnish';
527
        }
528
529 4
        if (isset($config['nginx'])) {
530 2
            return 'nginx';
531
        }
532
533 2
        if (isset($config['symfony'])) {
534 1
            return 'symfony';
535
        }
536
537 1
        if (isset($config['noop'])) {
538 1
            return 'noop';
539
        }
540
541
        throw new InvalidConfigurationException('No proxy client configured');
542
    }
543
544
    /**
545
     * Build the child definition with fallback for Symfony versions < 3.3.
546
     *
547
     * @param string $id Id of the service to extend
548
     *
549
     * @return ChildDefinition|DefinitionDecorator
550
     */
551 8
    private function createChildDefinition($id)
552
    {
553 8
        if (class_exists(ChildDefinition::class)) {
554
            return new ChildDefinition($id);
555
        }
556
557 8
        return new DefinitionDecorator($id);
0 ignored issues
show
Deprecated Code introduced by
The class Symfony\Component\Depend...ion\DefinitionDecorator has been deprecated with message: The DefinitionDecorator class is deprecated since version 3.3 and will be removed in 4.0. Use the Symfony\Component\DependencyInjection\ChildDefinition class instead.

This class, trait or interface has been deprecated. The supplier of the file has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the type will be removed from the class and what other constant to use instead.

Loading history...
558
    }
559
}
560