From 2ffa2302d6ec53e604c286f4964e237db3b3a786 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Mon, 17 Jun 2024 11:59:33 +0200 Subject: [PATCH] Throttle plugin configuration documentation --- .github/workflows/continuous-integration.yml | 2 +- src/DependencyInjection/Configuration.php | 17 ++++++++--- src/DependencyInjection/HttplugExtension.php | 7 +++-- .../HttplugExtensionTest.php | 29 ++++++++++++++----- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 972b562e..1f872754 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -43,7 +43,7 @@ jobs: - dependencies: "php-http/guzzle7-adapter" php-version: "8.2" symfony-deprecations-helper: "weak" - - dependencies: "php-http/guzzle7-adapter" + - dependencies: "php-http/guzzle7-adapter php-http/throttle-plugin" php-version: "8.3" symfony-deprecations-helper: "weak" diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 76b13751..62276584 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -630,12 +630,21 @@ private function addSharedPluginNodes(ArrayNodeDefinition $pluginNode, $disableA ->addDefaultsIfNotSet() ->children() ->scalarNode('name') - ->info('The name of the configured symfony/rate-limiter to use') ->isRequired() + ->info('Rate limiter service name from symfony/rate-limiter configuration. E.g. for a rate limiter http_client you specify limiter.http_client here') + ->end() + ->scalarNode('key') + ->defaultNull() + ->info('Key to avoid sharing this rate limiter with other clients or other services. You can use the name of the client for example.') + ->end() + ->integerNode('tokens') + ->defaultValue(1) + ->info('How many tokens spending per request') + ->end() + ->floatNode('max_time') + ->defaultNull() + ->info('Maximum accepted waiting time in seconds') ->end() - ->scalarNode('key')->defaultNull()->end() - ->integerNode('tokens')->defaultValue(1)->end() - ->floatNode('max_time')->defaultNull()->end() ->end() ->end(); // End throttle plugin diff --git a/src/DependencyInjection/HttplugExtension.php b/src/DependencyInjection/HttplugExtension.php index ce88c008..f5d63ceb 100644 --- a/src/DependencyInjection/HttplugExtension.php +++ b/src/DependencyInjection/HttplugExtension.php @@ -299,13 +299,14 @@ private function configurePluginByName($name, Definition $definition, array $con throw new InvalidConfigurationException('You need to require the Throttle Plugin to be able to use it: "composer require php-http/throttle-plugin".'); } + $limiterServiceId = $serviceId.'.'.$config['name']; $container - ->register($serviceId.$config['name'], LimiterInterface::class) - ->setFactory([new Reference('limiter.'.$config['name']), 'create']) + ->register($limiterServiceId, LimiterInterface::class) + ->setFactory([new Reference($config['name']), 'create']) ->addArgument($config['key']) ->setPublic(false); - $definition->replaceArgument(0, new Reference($serviceId.$config['name'])); + $definition->replaceArgument(0, new Reference($limiterServiceId)); $definition->setArgument('$tokens', $config['tokens']); $definition->setArgument('$maxTime', $config['max_time']); diff --git a/tests/Unit/DependencyInjection/HttplugExtensionTest.php b/tests/Unit/DependencyInjection/HttplugExtensionTest.php index 3b65c540..016085aa 100644 --- a/tests/Unit/DependencyInjection/HttplugExtensionTest.php +++ b/tests/Unit/DependencyInjection/HttplugExtensionTest.php @@ -5,6 +5,7 @@ namespace Http\HttplugBundle\Tests\Unit\DependencyInjection; use Http\Adapter\Guzzle7\Client; +use Http\Client\Common\Plugin\ThrottlePlugin; use Http\Client\HttpClient; use Http\Client\Plugin\Vcr\Recorder\InMemoryRecorder; use Http\HttplugBundle\Collector\PluginClientFactoryListener; @@ -79,7 +80,7 @@ public function testConfigLoadService(): void public function testClientPlugins(): void { - $this->load([ + $config = [ 'clients' => [ 'acme' => [ 'factory' => 'httplug.factory.curl', @@ -130,6 +131,11 @@ public function testClientPlugins(): void 'headers' => ['X-FOO'], ], ], + [ + 'query_defaults' => [ + 'parameters' => ['locale' => 'en'], + ], + ], [ 'request_seekable_body' => [ 'use_file_buffer' => true, @@ -138,11 +144,6 @@ public function testClientPlugins(): void [ 'response_seekable_body' => true, ], - [ - 'query_defaults' => [ - 'parameters' => ['locale' => 'en'], - ], - ], [ 'authentication' => [ 'my_basic' => [ @@ -165,7 +166,16 @@ public function testClientPlugins(): void ], ], ], - ]); + ]; + if (class_exists(ThrottlePlugin::class)) { + $config['clients']['acme']['plugins'][] = [ + 'throttle' => [ + 'name' => 'limiter.test', + ], + ]; + } + + $this->load($config); $plugins = [ 'httplug.client.acme.plugin.decoder', @@ -178,13 +188,16 @@ public function testClientPlugins(): void 'httplug.client.acme.plugin.header_defaults', 'httplug.client.acme.plugin.header_set', 'httplug.client.acme.plugin.header_remove', + 'httplug.client.acme.plugin.query_defaults', 'httplug.client.acme.plugin.request_seekable_body', 'httplug.client.acme.plugin.response_seekable_body', - 'httplug.client.acme.plugin.query_defaults', 'httplug.client.acme.authentication.my_basic', 'httplug.client.acme.plugin.cache', 'httplug.client.acme.plugin.error', ]; + if (\class_exists(ThrottlePlugin::class)) { + $plugins[] = 'httplug.client.acme.plugin.throttle'; + } $pluginReferences = array_map(function ($id) { return new Reference($id); }, $plugins);