Completed
Push — master ( 6a2de0...36e020 )
by Márk
37:44 queued 30:09
created

HttplugExtension::configurePlugins()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 2
Bugs 0 Features 1
Metric Value
c 2
b 0
f 1
dl 0
loc 17
ccs 0
cts 0
cp 0
rs 9.2
cc 4
eloc 11
nc 6
nop 2
crap 20
1
<?php
2
3
namespace Http\HttplugBundle\DependencyInjection;
4
5
use Http\Client\Plugin\AuthenticationPlugin;
6
use Http\Client\Plugin\PluginClient;
7
use Http\HttplugBundle\ClientFactory\DummyClient;
8
use Http\Message\Authentication\BasicAuth;
9
use Http\Message\Authentication\Bearer;
10
use Http\Message\Authentication\Wsse;
11
use Symfony\Component\Config\FileLocator;
12
use Symfony\Component\DependencyInjection\ContainerBuilder;
13
use Symfony\Component\DependencyInjection\Definition;
14
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
15
use Symfony\Component\DependencyInjection\Reference;
16
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
17
18
/**
19
 * @author David Buchmann <[email protected]>
20
 * @author Tobias Nyholm <[email protected]>
21
 */
22
class HttplugExtension extends Extension
23
{
24
    /**
25
     * {@inheritdoc}
26
     */
27 3
    public function load(array $configs, ContainerBuilder $container)
28
    {
29 3
        $configuration = $this->getConfiguration($configs, $container);
30 3
        $config = $this->processConfiguration($configuration, $configs);
0 ignored issues
show
Documentation introduced by
$configuration is of type object|null, but the function expects a object<Symfony\Component...ConfigurationInterface>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
31
32 3
        $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
33
34 3
        $loader->load('services.xml');
35 3
        $loader->load('plugins.xml');
36
37 3
        $enabled = is_bool($config['toolbar']['enabled']) ? $config['toolbar']['enabled'] : $container->hasParameter('kernel.debug') && $container->getParameter('kernel.debug');
38 3
        if ($enabled) {
39
            $loader->load('data-collector.xml');
40
            $config['_inject_collector_plugin'] = true;
41
42
            if (!empty($config['toolbar']['formatter'])) {
43
                $container->getDefinition('httplug.collector.message_journal')
44
                    ->replaceArgument(0, new Reference($config['toolbar']['formatter']));
45
            }
46
        }
47
48 3
        foreach ($config['classes'] as $service => $class) {
49 3
            if (!empty($class)) {
50 1
                $container->register(sprintf('httplug.%s.default', $service), $class);
51 1
            }
52 3
        }
53
54 3
        foreach ($config['main_alias'] as $type => $id) {
55 3
            $container->setAlias(sprintf('httplug.%s', $type), $id);
56 3
        }
57
58 3
        $this->configurePlugins($container, $config['plugins']);
59 3
        $this->configureClients($container, $config);
60 3
    }
61
62
    /**
63
     * Configure client services.
64
     *
65
     * @param ContainerBuilder $container
66
     * @param array            $config
67
     */
68 3
    private function configureClients(ContainerBuilder $container, array $config)
69
    {
70 3
        $first = isset($config['clients']['default']) ? 'default' : null;
71 3
        foreach ($config['clients'] as $name => $arguments) {
72
            if ($first === null) {
73
                $first = $name;
74
            }
75
76
            if (isset($config['_inject_collector_plugin'])) {
77
                array_unshift($arguments['plugins'], 'httplug.collector.history_plugin');
78
            }
79
80
            $def = $container->register('httplug.client.'.$name, DummyClient::class);
81
82
            if (empty($arguments['plugins'])) {
83
                $def->setFactory([new Reference($arguments['factory']), 'createClient'])
84
                    ->addArgument($arguments['config']);
85
            } else {
86
                $def->setFactory('Http\HttplugBundle\ClientFactory\PluginClientFactory::createPluginClient')
87
                    ->addArgument(array_map(function ($id) {
88
                        return new Reference($id);
89
                    }, $arguments['plugins']))
90
                    ->addArgument(new Reference($arguments['factory']))
91
                    ->addArgument($arguments['config']);
92
            }
93 3
        }
94
95
        // If we have clients configured
96 3
        if ($first !== null) {
97
            if ($first !== 'default') {
98
                // Alias the first client to httplug.client.default
99
                $container->setAlias('httplug.client.default', 'httplug.client.'.$first);
100
            }
101 3
        } elseif (isset($config['_inject_collector_plugin'])) {
102
            // No client was configured. Make sure to inject history plugin to the auto discovery client.
103
            $container->register('httplug.client', PluginClient::class)
104
                ->addArgument(new Reference('httplug.client.default'))
105
                ->addArgument([new Reference('httplug.collector.history_plugin')]);
106
        }
107
    }
108
109
    /**
110
     * @param ContainerBuilder $container
111
     * @param array            $config
112
     */
113
    private function configurePlugins(ContainerBuilder $container, array $config)
114
    {
115
        if (!empty($config['authentication'])) {
116
            $this->configureAuthentication($container, $config['authentication']);
117
        }
118
        unset($config['authentication']);
119
120
        foreach ($config as $name => $pluginConfig) {
121
            $pluginId = 'httplug.plugin.'.$name;
122
            if ($pluginConfig['enabled']) {
123
                $def = $container->getDefinition($pluginId);
124
                $this->configurePluginByName($name, $def, $pluginConfig);
125
            } else {
126
                $container->removeDefinition($pluginId);
127
            }
128
        }
129
    }
130
131
    /**
132
     * @param string     $name
133
     * @param Definition $definition
134
     * @param array      $config
135
     */
136
    private function configurePluginByName($name, Definition $definition, array $config)
137
    {
138
        switch ($name) {
139
            case 'cache':
140
                $definition
141
                    ->replaceArgument(0, new Reference($config['cache_pool']))
142
                    ->replaceArgument(1, new Reference($config['stream_factory']))
143
                    ->replaceArgument(2, $config['config']);
144
                break;
145
            case 'cookie':
146
                $definition->replaceArgument(0, new Reference($config['cookie_jar']));
147
                break;
148
            case 'decoder':
149
                $definition->addArgument($config['use_content_encoding']);
150
                break;
151
            case 'history':
152
                $definition->replaceArgument(0, new Reference($config['journal']));
153
                break;
154
            case 'logger':
155
                $definition->replaceArgument(0, new Reference($config['logger']));
156
                if (!empty($config['formatter'])) {
157
                    $definition->replaceArgument(1, new Reference($config['formatter']));
158
                }
159
                break;
160
            case 'redirect':
161
                $definition
162
                    ->addArgument($config['preserve_header'])
163
                    ->addArgument($config['use_default_for_multiple']);
164
                break;
165
            case 'retry':
166
                $definition->addArgument($config['retry']);
167
                break;
168
            case 'stopwatch':
169
                $definition->replaceArgument(0, new Reference($config['stopwatch']));
170
                break;
171
        }
172
    }
173
174
    /**
175
     * @param ContainerBuilder $container
176
     * @param array            $config
177
     */
178
    private function configureAuthentication(ContainerBuilder $container, array $config)
179
    {
180
        foreach ($config as $name => $values) {
181
            $authServiceKey = sprintf('httplug.plugin.authentication.%s.auth', $name);
182
            switch ($values['type']) {
183
                case 'bearer':
184
                    $container->register($authServiceKey, Bearer::class)
185
                        ->addArgument($values['token']);
186
                    break;
187
                case 'basic':
188
                    $container->register($authServiceKey, BasicAuth::class)
189
                        ->addArgument($values['username'])
190
                        ->addArgument($values['password']);
191
                    break;
192
                case 'wsse':
193
                    $container->register($authServiceKey, Wsse::class)
194
                        ->addArgument($values['username'])
195
                        ->addArgument($values['password']);
196
                    break;
197
                case 'service':
198
                    $authServiceKey = $values['service'];
199
                    break;
200
                default:
201
                    throw new \LogicException(sprintf('Unknown authentication type: "%s"', $values['type']));
202
            }
203
204
            $container->register('httplug.plugin.authentication.'.$name, AuthenticationPlugin::class)
205
                ->addArgument(new Reference($authServiceKey));
206
        }
207
    }
208
}
209