From 7cb6fb1b8eefe8d0084474e6fa8d827ac6dabbc7 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 16:36:38 +0200 Subject: [PATCH 01/12] add ThrottlePlugin --- src/DependencyInjection/Configuration.php | 11 +++++++++++ src/DependencyInjection/HttplugExtension.php | 9 +++++++++ src/Resources/config/plugins.xml | 3 +++ 3 files changed, 23 insertions(+) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 4b842990..0b527b99 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -624,6 +624,17 @@ private function addSharedPluginNodes(ArrayNodeDefinition $pluginNode, $disableA ->end() ->end(); // End error plugin + + $throttle = $children->arrayNode('throttle') + ->canBeEnabled() + ->addDefaultsIfNotSet() + ->children() + ->scalarNode('name')->end() + ->scalarNode('tokens')->defaultValue(1)->end() + ->scalarNode('max_time')->defaultNull()->end() + ->end() + ->end(); + // End throttle plugin } /** diff --git a/src/DependencyInjection/HttplugExtension.php b/src/DependencyInjection/HttplugExtension.php index 3fea496c..8b652a3c 100644 --- a/src/DependencyInjection/HttplugExtension.php +++ b/src/DependencyInjection/HttplugExtension.php @@ -292,6 +292,15 @@ private function configurePluginByName($name, Definition $definition, array $con break; + case 'throttle': + $definition->replaceArgument(0, new Reference('rate_limiter.'.$config['name'])); + $definition->addArgument([ + 'tokens' => $config['tokens'], + 'maxTime' => $config['max_time'], + ]); + + break; + /* client specific plugins */ case 'add_host': diff --git a/src/Resources/config/plugins.xml b/src/Resources/config/plugins.xml index 749407c4..9f9c0ec1 100644 --- a/src/Resources/config/plugins.xml +++ b/src/Resources/config/plugins.xml @@ -28,6 +28,9 @@ + + + From fddf99c446a7850df77af880856024246ea07f7c Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 19:58:03 +0200 Subject: [PATCH 02/12] fix tests --- tests/Unit/DependencyInjection/ConfigurationTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/Unit/DependencyInjection/ConfigurationTest.php b/tests/Unit/DependencyInjection/ConfigurationTest.php index 447efe1a..eb53baa1 100644 --- a/tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/tests/Unit/DependencyInjection/ConfigurationTest.php @@ -98,6 +98,11 @@ class ConfigurationTest extends AbstractExtensionConfigurationTestCase 'enabled' => false, 'only_server_exception' => false, ], + 'throttle' => [ + 'enabled' => false, + 'tokens' => 1, + 'max_time' => null, + ], ], 'discovery' => [ 'client' => 'auto', @@ -308,6 +313,12 @@ public function testSupportsAllConfigFormats(): void 'enabled' => false, 'only_server_exception' => false, ], + 'throttle' => [ + 'enabled' => false, + 'name' => 'limit', + 'tokens' => 1, + 'max_time' => null, + ], ], 'discovery' => [ 'client' => 'auto', From abc400764bb5ae53eb51657b7c76f671489bebb7 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 19:59:59 +0200 Subject: [PATCH 03/12] fix cs --- src/DependencyInjection/Configuration.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 0b527b99..843dbbe1 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -625,7 +625,7 @@ private function addSharedPluginNodes(ArrayNodeDefinition $pluginNode, $disableA ->end(); // End error plugin - $throttle = $children->arrayNode('throttle') + $throttle = $children->arrayNode('throttle') ->canBeEnabled() ->addDefaultsIfNotSet() ->children() From b3911138ae29da02d39cf31ec90ab04abd069b65 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 20:02:23 +0200 Subject: [PATCH 04/12] fix tests --- tests/Unit/DependencyInjection/ConfigurationTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/DependencyInjection/ConfigurationTest.php b/tests/Unit/DependencyInjection/ConfigurationTest.php index eb53baa1..69dbbec3 100644 --- a/tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/tests/Unit/DependencyInjection/ConfigurationTest.php @@ -315,7 +315,6 @@ public function testSupportsAllConfigFormats(): void ], 'throttle' => [ 'enabled' => false, - 'name' => 'limit', 'tokens' => 1, 'max_time' => null, ], From 904108ebdb5771472d9275abe99e18b30a66284d Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 21:17:27 +0200 Subject: [PATCH 05/12] fixes --- src/DependencyInjection/Configuration.php | 5 +++-- src/DependencyInjection/HttplugExtension.php | 16 +++++++++++----- .../DependencyInjection/ConfigurationTest.php | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 843dbbe1..bd70c712 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -630,8 +630,9 @@ private function addSharedPluginNodes(ArrayNodeDefinition $pluginNode, $disableA ->addDefaultsIfNotSet() ->children() ->scalarNode('name')->end() - ->scalarNode('tokens')->defaultValue(1)->end() - ->scalarNode('max_time')->defaultNull()->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 8b652a3c..6b793316 100644 --- a/src/DependencyInjection/HttplugExtension.php +++ b/src/DependencyInjection/HttplugExtension.php @@ -35,6 +35,7 @@ use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\HttpKernel\Kernel; +use Symfony\Component\RateLimiter\LimiterInterface; use Twig\Environment as TwigEnvironment; /** @@ -293,11 +294,16 @@ private function configurePluginByName($name, Definition $definition, array $con break; case 'throttle': - $definition->replaceArgument(0, new Reference('rate_limiter.'.$config['name'])); - $definition->addArgument([ - 'tokens' => $config['tokens'], - 'maxTime' => $config['max_time'], - ]); + $key = $config['name'] ? '.'.$config['name'] : ''; + $container + ->register($serviceId.$key, LimiterInterface::class) + ->setFactory([new Reference('limiter.'.$config['name']), 'create']) + ->addArgument($config['key']) + ->setPublic(false); + + $definition->replaceArgument(0, new Reference($serviceId.$key)); + $definition->setArgument('$tokens', $config['tokens']); + $definition->setArgument('$maxTime', $config['max_time']); break; diff --git a/tests/Unit/DependencyInjection/ConfigurationTest.php b/tests/Unit/DependencyInjection/ConfigurationTest.php index 69dbbec3..54615903 100644 --- a/tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/tests/Unit/DependencyInjection/ConfigurationTest.php @@ -100,6 +100,7 @@ class ConfigurationTest extends AbstractExtensionConfigurationTestCase ], 'throttle' => [ 'enabled' => false, + 'key' => null, 'tokens' => 1, 'max_time' => null, ], From d3fefdac81d01ed8d55c07fcc4b1ce29628cae22 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 21:23:18 +0200 Subject: [PATCH 06/12] fix test --- tests/Unit/DependencyInjection/ConfigurationTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Unit/DependencyInjection/ConfigurationTest.php b/tests/Unit/DependencyInjection/ConfigurationTest.php index 54615903..999c813b 100644 --- a/tests/Unit/DependencyInjection/ConfigurationTest.php +++ b/tests/Unit/DependencyInjection/ConfigurationTest.php @@ -316,6 +316,7 @@ public function testSupportsAllConfigFormats(): void ], 'throttle' => [ 'enabled' => false, + 'key' => null, 'tokens' => 1, 'max_time' => null, ], From 27b776f39f037127134e7576ba5eda3eba306b63 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 21:27:37 +0200 Subject: [PATCH 07/12] add tests --- composer.json | 1 + tests/Unit/DependencyInjection/HttplugExtensionTest.php | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/composer.json b/composer.json index 27111a4a..b46d0f41 100644 --- a/composer.json +++ b/composer.json @@ -52,6 +52,7 @@ "matthiasnoback/symfony-dependency-injection-test": "^4.0 || ^5.0", "nyholm/nsa": "^1.1", "nyholm/psr7": "^1.2.1", + "php-http/throttle-plugin": "^1.1", "php-http/cache-plugin": "^1.7", "php-http/mock-client": "^1.2", "php-http/promise": "^1.0", diff --git a/tests/Unit/DependencyInjection/HttplugExtensionTest.php b/tests/Unit/DependencyInjection/HttplugExtensionTest.php index 3b65c540..e771d412 100644 --- a/tests/Unit/DependencyInjection/HttplugExtensionTest.php +++ b/tests/Unit/DependencyInjection/HttplugExtensionTest.php @@ -162,6 +162,11 @@ public function testClientPlugins(): void 'only_server_exception' => true, ], ], + [ + 'throttle' => [ + 'name' => 'test', + ], + ], ], ], ], @@ -184,6 +189,7 @@ public function testClientPlugins(): void 'httplug.client.acme.authentication.my_basic', 'httplug.client.acme.plugin.cache', 'httplug.client.acme.plugin.error', + 'httplug.client.acme.plugin.throttle', ]; $pluginReferences = array_map(function ($id) { return new Reference($id); From 774c7409a5e65eec13006dc284acc84ad01d9ba9 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 21:39:16 +0200 Subject: [PATCH 08/12] revert test --- composer.json | 1 - tests/Unit/DependencyInjection/HttplugExtensionTest.php | 5 ----- 2 files changed, 6 deletions(-) diff --git a/composer.json b/composer.json index b46d0f41..27111a4a 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,6 @@ "matthiasnoback/symfony-dependency-injection-test": "^4.0 || ^5.0", "nyholm/nsa": "^1.1", "nyholm/psr7": "^1.2.1", - "php-http/throttle-plugin": "^1.1", "php-http/cache-plugin": "^1.7", "php-http/mock-client": "^1.2", "php-http/promise": "^1.0", diff --git a/tests/Unit/DependencyInjection/HttplugExtensionTest.php b/tests/Unit/DependencyInjection/HttplugExtensionTest.php index e771d412..323097fa 100644 --- a/tests/Unit/DependencyInjection/HttplugExtensionTest.php +++ b/tests/Unit/DependencyInjection/HttplugExtensionTest.php @@ -162,11 +162,6 @@ public function testClientPlugins(): void 'only_server_exception' => true, ], ], - [ - 'throttle' => [ - 'name' => 'test', - ], - ], ], ], ], From f10afcbd0b4e89cde0fd46e5f3a428af4c8ccbf6 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 21:41:04 +0200 Subject: [PATCH 09/12] fix test --- tests/Unit/DependencyInjection/HttplugExtensionTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/DependencyInjection/HttplugExtensionTest.php b/tests/Unit/DependencyInjection/HttplugExtensionTest.php index 323097fa..3b65c540 100644 --- a/tests/Unit/DependencyInjection/HttplugExtensionTest.php +++ b/tests/Unit/DependencyInjection/HttplugExtensionTest.php @@ -184,7 +184,6 @@ public function testClientPlugins(): void 'httplug.client.acme.authentication.my_basic', 'httplug.client.acme.plugin.cache', 'httplug.client.acme.plugin.error', - 'httplug.client.acme.plugin.throttle', ]; $pluginReferences = array_map(function ($id) { return new Reference($id); From e9e64bf20d182e0564bf42c5b66c3fa37ffa10d8 Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Fri, 14 Jun 2024 22:14:25 +0200 Subject: [PATCH 10/12] add additional checks --- src/DependencyInjection/HttplugExtension.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/DependencyInjection/HttplugExtension.php b/src/DependencyInjection/HttplugExtension.php index 6b793316..2e7165af 100644 --- a/src/DependencyInjection/HttplugExtension.php +++ b/src/DependencyInjection/HttplugExtension.php @@ -10,6 +10,7 @@ use Http\Client\Common\HttpMethodsClient; use Http\Client\Common\HttpMethodsClientInterface; use Http\Client\Common\Plugin\AuthenticationPlugin; +use Http\Client\Common\Plugin\ThrottlePlugin; use Http\Client\Common\PluginClient; use Http\Client\Common\PluginClientFactory; use Http\Client\HttpAsyncClient; @@ -294,6 +295,14 @@ private function configurePluginByName($name, Definition $definition, array $con break; case 'throttle': + if (!\interface_exists(LimiterInterface::class)) { + throw new InvalidConfigurationException('You need to require the Rate Limiter to be able to use it: "composer require symfony/rate-limiter".'); + } + + if (!\class_exists(ThrottlePlugin::class)) { + throw new InvalidConfigurationException('You need to require the Throttle Plugin to be able to use it: "composer require php-http/throttle-plugin".'); + } + $key = $config['name'] ? '.'.$config['name'] : ''; $container ->register($serviceId.$key, LimiterInterface::class) From 8f2f9bf156f7056d7ed037b38dd8143f27d6d1fb Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Sun, 16 Jun 2024 22:53:05 +0200 Subject: [PATCH 11/12] add conflic version --- composer.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 27111a4a..3daeef71 100644 --- a/composer.json +++ b/composer.json @@ -45,7 +45,8 @@ "php-http/guzzle6-adapter": "<1.1", "php-http/cache-plugin": "<1.7.0", "php-http/curl-client": "<2.0", - "php-http/socket-client": "<2.0" + "php-http/socket-client": "<2.0", + "php-http/throttle-plugin": "<1.1" }, "require-dev": { "guzzlehttp/psr7": "^1.7 || ^2.0", From 12e1816b261060b74c4aa7198528d7668a17ddba Mon Sep 17 00:00:00 2001 From: Maxim Solovev Date: Sun, 16 Jun 2024 22:55:35 +0200 Subject: [PATCH 12/12] remove dead code --- src/DependencyInjection/HttplugExtension.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/DependencyInjection/HttplugExtension.php b/src/DependencyInjection/HttplugExtension.php index 2e7165af..cdcbfcf0 100644 --- a/src/DependencyInjection/HttplugExtension.php +++ b/src/DependencyInjection/HttplugExtension.php @@ -295,10 +295,6 @@ private function configurePluginByName($name, Definition $definition, array $con break; case 'throttle': - if (!\interface_exists(LimiterInterface::class)) { - throw new InvalidConfigurationException('You need to require the Rate Limiter to be able to use it: "composer require symfony/rate-limiter".'); - } - if (!\class_exists(ThrottlePlugin::class)) { throw new InvalidConfigurationException('You need to require the Throttle Plugin to be able to use it: "composer require php-http/throttle-plugin".'); }