GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Pull Request — master (#216)
by
unknown
04:20
created

defineProfileMiddleware()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 11
nc 3
nop 3
dl 0
loc 18
rs 9.9
c 0
b 0
f 0
1
<?php
2
3
namespace EightPoints\Bundle\GuzzleBundle\DependencyInjection;
4
5
use EightPoints\Bundle\GuzzleBundle\Twig\Extension\DebugExtension;
6
use RuntimeException;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
9
use Symfony\Component\DependencyInjection\Reference;
10
use Symfony\Component\DependencyInjection\Definition;
11
use Symfony\Component\Config\FileLocator;
12
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
13
use Symfony\Component\ExpressionLanguage\Expression;
14
use GuzzleHttp\HandlerStack;
15
16
class EightPointsGuzzleExtension extends Extension
17
{
18
    /** @var \EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundlePlugin[] */
19
    protected $plugins;
20
21
    /**
22
     * @param \EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundlePlugin[] $plugins
23
     */
24
    public function __construct(array $plugins = [])
25
    {
26
        $this->plugins = $plugins;
27
    }
28
29
    /**
30
     * {@inheritdoc}
31
     */
32
    public function getConfiguration(array $config, ContainerBuilder $container) : Configuration
33
    {
34
        return new Configuration($this->getAlias(), $container->getParameter('kernel.debug'), $this->plugins);
35
    }
36
37
    /**
38
     * Loads the Guzzle configuration.
39
     *
40
     * @param array $configs an array of configuration settings
41
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container a ContainerBuilder instance
42
     *
43
     * @throws \InvalidArgumentException
44
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
45
     * @throws \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
46
     * @throws \Exception
47
     *
48
     * @return void
49
     */
50
    public function load(array $configs, ContainerBuilder $container)
51
    {
52
        $configPath = implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'Resources', 'config']);
53
        $loader     = new XmlFileLoader($container, new FileLocator($configPath));
54
55
        $loader->load('services.xml');
56
57
        $configuration = new Configuration($this->getAlias(), $container->getParameter('kernel.debug'), $this->plugins);
58
        $config        = $this->processConfiguration($configuration, $configs);
59
        $logging       = $config['logging'] === true;
60
        $profiling     = $config['profiling'] === true;
61
62
        foreach ($this->plugins as $plugin) {
63
            $container->addObjectResource(new \ReflectionClass(get_class($plugin)));
64
            $plugin->load($config, $container);
65
        }
66
67
        if ($logging) {
68
            $this->defineTwigDebugExtension($container);
69
            $this->defineLogger($container);
70
            $this->defineDataCollector($container);
71
            $this->defineFormatter($container);
72
            $this->defineSymfonyLogFormatter($container);
73
            $this->defineSymfonyLogMiddleware($container);
74
        }
75
76
        foreach ($config['clients'] as $name => $options) {
77
            $argument = [
78
                'base_uri' => $options['base_url'],
79
                'handler'  => $this->createHandler($container, $name, $options, $logging, $profiling)
80
            ];
81
82
            // if present, add default options to the constructor argument for the Guzzle client
83
            if (isset($options['options']) && is_array($options['options'])) {
84
                foreach ($options['options'] as $key => $value) {
85
                    if ($value === null || (is_array($value) && count($value) === 0)) {
86
                        continue;
87
                    }
88
89
                    $argument[$key] = $value;
90
                }
91
            }
92
93
            $client = new Definition($options['class']);
94
            $client->addArgument($argument);
95
            $client->setPublic(true);
96
            $client->setLazy($options['lazy']);
97
98
            // set service name based on client name
99
            $serviceName = sprintf('%s.client.%s', $this->getAlias(), $name);
100
            $container->setDefinition($serviceName, $client);
101
        }
102
    }
103
104
    /**
105
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
106
     * @param string $clientName
107
     * @param array $options
108
     * @param bool $logging
109
     *
110
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
111
     * @throws \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
112
     *
113
     * @return \Symfony\Component\DependencyInjection\Definition
114
     */
115
    protected function createHandler(ContainerBuilder $container, string $clientName, array $options, bool $logging, bool $profiling) : Definition
116
    {
117
        // Event Dispatching service
118
        $eventServiceName = sprintf('eight_points_guzzle.middleware.event_dispatch.%s', $clientName);
119
        $eventService = $this->createEventMiddleware($clientName);
120
        $container->setDefinition($eventServiceName, $eventService);
121
122
        // Create the event Dispatch Middleware
123
        $eventExpression  = new Expression(sprintf("service('%s').dispatchEvent()", $eventServiceName));
124
125
        $handler = new Definition(HandlerStack::class);
126
        $handler->setFactory([HandlerStack::class, 'create']);
127
        $handler->setPublic(true);
128
        $handler->setLazy($options['lazy']);
129
130
        if ($logging) {
131
            $this->defineLogMiddleware($container, $handler, $clientName);
132
            $this->defineRequestTimeMiddleware($container, $handler, $clientName);
133
            $this->attachSymfonyLogMiddlewareToHandler($handler);
134
        }
135
136
        if ($profiling) {
137
            $this->defineProfileMiddleware($container, $handler, $clientName);
138
        }
139
140
        foreach ($this->plugins as $plugin) {
141
            $plugin->loadForClient($options['plugin'][$plugin->getPluginName()], $container, $clientName, $handler);
142
        }
143
144
        // goes on the end of the stack.
145
        $handler->addMethodCall('unshift', [$eventExpression, 'events']);
146
147
        return $handler;
148
    }
149
150
    /**
151
     * @param ContainerBuilder $container
152
     *
153
     * @return void
154
     */
155
    protected function defineTwigDebugExtension(ContainerBuilder $container)
156
    {
157
        $twigDebugExtensionDefinition = new Definition(DebugExtension::class);
158
        $twigDebugExtensionDefinition->addTag('twig.extension');
159
        $twigDebugExtensionDefinition->setPublic(false);
160
        $container->setDefinition('eight_points_guzzle.twig_extension.debug', $twigDebugExtensionDefinition);
161
    }
162
163
    /**
164
     * Define Logger
165
     *
166
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
167
     *
168
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
169
     *
170
     * @return void
171
     */
172
    protected function defineLogger(ContainerBuilder $container)
173
    {
174
        $loggerDefinition = new Definition('%eight_points_guzzle.logger.class%');
175
        $loggerDefinition->setPublic(true);
176
        $container->setDefinition('eight_points_guzzle.logger', $loggerDefinition);
177
    }
178
179
    /**
180
     * Define Data Collector
181
     *
182
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
183
     *
184
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
185
     *
186
     * @return void
187
     */
188
    protected function defineDataCollector(ContainerBuilder $container)
189
    {
190
        $dataCollectorDefinition = new Definition('%eight_points_guzzle.data_collector.class%');
191
        $dataCollectorDefinition->addArgument(new Reference('eight_points_guzzle.logger'));
192
        $dataCollectorDefinition->setPublic(false);
193
        $dataCollectorDefinition->addTag('data_collector', [
194
            'id' => 'eight_points_guzzle',
195
            'template' => '@EightPointsGuzzle/debug.html.twig',
196
        ]);
197
        $container->setDefinition('eight_points_guzzle.data_collector', $dataCollectorDefinition);
198
    }
199
200
    /**
201
     * Define Formatter
202
     *
203
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
204
     *
205
     * @throws \Symfony\Component\DependencyInjection\Exception\BadMethodCallException
206
     *
207
     * @return void
208
     */
209
    protected function defineFormatter(ContainerBuilder $container)
210
    {
211
        $formatterDefinition = new Definition('%eight_points_guzzle.formatter.class%');
212
        $formatterDefinition->setPublic(true);
213
        $container->setDefinition('eight_points_guzzle.formatter', $formatterDefinition);
214
    }
215
216
    /**
217
     * Define Request Time Middleware
218
     *
219
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
220
     * @param \Symfony\Component\DependencyInjection\Definition $handler
221
     * @param string $clientName
222
     *
223
     * @return void
224
     */
225
    protected function defineRequestTimeMiddleware(ContainerBuilder $container, Definition $handler, string $clientName)
226
    {
227
        $requestTimeMiddlewareDefinitionName = sprintf('eight_points_guzzle.middleware.request_time.%s', $clientName);
228
        $requestTimeMiddlewareDefinition = new Definition('%eight_points_guzzle.middleware.request_time.class%');
229
        $requestTimeMiddlewareDefinition->addArgument(new Reference('eight_points_guzzle.logger'));
230
        $requestTimeMiddlewareDefinition->addArgument(new Reference('eight_points_guzzle.data_collector'));
231
        $requestTimeMiddlewareDefinition->setPublic(true);
232
        $container->setDefinition($requestTimeMiddlewareDefinitionName, $requestTimeMiddlewareDefinition);
233
234
        $requestTimeExpression = new Expression(sprintf("service('%s')", $requestTimeMiddlewareDefinitionName));
235
        $handler->addMethodCall('after', ['log', $requestTimeExpression, 'request_time']);
236
    }
237
238
    /**
239
     * Define Log Middleware for client
240
     *
241
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
242
     * @param \Symfony\Component\DependencyInjection\Definition $handler
243
     * @param string $clientName
244
     *
245
     * @return void
246
     */
247
    protected function defineLogMiddleware(ContainerBuilder $container, Definition $handler, string $clientName)
248
    {
249
        $logMiddlewareDefinitionName = sprintf('eight_points_guzzle.middleware.log.%s', $clientName);
250
        $logMiddlewareDefinition = new Definition('%eight_points_guzzle.middleware.log.class%');
251
        $logMiddlewareDefinition->addArgument(new Reference('eight_points_guzzle.logger'));
252
        $logMiddlewareDefinition->addArgument(new Reference('eight_points_guzzle.formatter'));
253
        $logMiddlewareDefinition->setPublic(true);
254
        $container->setDefinition($logMiddlewareDefinitionName, $logMiddlewareDefinition);
255
256
        $logExpression = new Expression(sprintf("service('%s').log()", $logMiddlewareDefinitionName));
257
        $handler->addMethodCall('push', [$logExpression, 'log']);
258
    }
259
260
    /**
261
     * Define Profile Middleware for client
262
     *
263
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
264
     * @param \Symfony\Component\DependencyInjection\Definition $handler
265
     * @param string $clientName
266
     *
267
     * @return void
268
     */
269
    protected function defineProfileMiddleware(ContainerBuilder $container, Definition $handler, string $clientName)
270
    {
271
        if (!$container->has('debug.stopwatch')) {
272
            throw new RuntimeException('Eightpoint GuzzleBundle profiling requires "debug.stopwatch" service. Is debugging disabled?');
273
        }
274
275
        if (!class_exists('Symfony\Component\Stopwatch\Stopwatch')) {
276
            throw new RuntimeException('Eightpoint GuzzleBundle profiling requires "symfony/stopwatch" package');
277
        }
278
279
        $logMiddlewareDefinitionName = sprintf('eight_points_guzzle.middleware.profile.%s', $clientName);
280
        $logMiddlewareDefinition = new Definition('%eight_points_guzzle.middleware.profile.class%');
281
        $logMiddlewareDefinition->addArgument(new Reference('debug.stopwatch'));
282
        $logMiddlewareDefinition->setPublic(false);
283
        $container->setDefinition($logMiddlewareDefinitionName, $logMiddlewareDefinition);
284
285
        $logExpression = new Expression(sprintf("service('%s').profile()", $logMiddlewareDefinitionName));
286
        $handler->addMethodCall('push', [$logExpression, 'profile']);
287
    }
288
289
    /**
290
     * @param \Symfony\Component\DependencyInjection\Definition $handler
291
     *
292
     * @return void
293
     */
294
    protected function attachSymfonyLogMiddlewareToHandler(Definition $handler)
295
    {
296
        $logExpression = new Expression(sprintf("service('%s')", 'eight_points_guzzle.middleware.symfony_log'));
297
        $handler->addMethodCall('push', [$logExpression, 'symfony_log']);
298
    }
299
300
    /**
301
     * Create Middleware For dispatching events
302
     *
303
     * @param string $name
304
     *
305
     * @return \Symfony\Component\DependencyInjection\Definition
306
     */
307
    protected function createEventMiddleware(string $name) : Definition
308
    {
309
        $eventMiddleWare = new Definition('%eight_points_guzzle.middleware.event_dispatcher.class%');
310
        $eventMiddleWare->addArgument(new Reference('event_dispatcher'));
311
        $eventMiddleWare->addArgument($name);
312
        $eventMiddleWare->setPublic(true);
313
314
        return $eventMiddleWare;
315
    }
316
317
    /**
318
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
319
     *
320
     * @return void
321
     */
322
    protected function defineSymfonyLogFormatter(ContainerBuilder $container)
323
    {
324
        $formatterDefinition = new Definition('%eight_points_guzzle.symfony_log_formatter.class%');
325
        $formatterDefinition->setArguments(['%eight_points_guzzle.symfony_log_formatter.pattern%']);
326
        $formatterDefinition->setPublic(true);
327
        $container->setDefinition('eight_points_guzzle.symfony_log_formatter', $formatterDefinition);
328
    }
329
330
    /**
331
     * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
332
     *
333
     * @return void
334
     */
335
    protected function defineSymfonyLogMiddleware(ContainerBuilder $container)
336
    {
337
        $logMiddlewareDefinition = new Definition('%eight_points_guzzle.middleware.symfony_log.class%');
338
        $logMiddlewareDefinition->addArgument(new Reference('logger'));
339
        $logMiddlewareDefinition->addArgument(new Reference('eight_points_guzzle.symfony_log_formatter'));
340
        $logMiddlewareDefinition->setPublic(true);
341
        $logMiddlewareDefinition->addTag('monolog.logger', ['channel' => 'eight_points_guzzle']);
342
        $container->setDefinition('eight_points_guzzle.middleware.symfony_log', $logMiddlewareDefinition);
343
    }
344
345
    /**
346
     * Returns alias of extension
347
     *
348
     * @return string
349
     */
350
    public function getAlias() : string
351
    {
352
        return 'eight_points_guzzle';
353
    }
354
}
355