From d584048bdee63ecac31f38618f4abe9446ee2646 Mon Sep 17 00:00:00 2001 From: Wang Ruiheng Date: Sat, 2 Mar 2019 09:40:24 +0800 Subject: [PATCH] extend provider options with httpClientConfig key --- src/Provider/AbstractProvider.php | 14 +++-- test/src/Provider/AbstractProviderTest.php | 61 ++++++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/Provider/AbstractProvider.php b/src/Provider/AbstractProvider.php index d1679998..ce8a2e5b 100644 --- a/src/Provider/AbstractProvider.php +++ b/src/Provider/AbstractProvider.php @@ -126,11 +126,17 @@ public function __construct(array $options = [], array $collaborators = []) $this->setRequestFactory($collaborators['requestFactory']); if (empty($collaborators['httpClient'])) { + $client_config = []; $client_options = $this->getAllowedClientOptions($options); - - $collaborators['httpClient'] = new HttpClient( - array_intersect_key($options, array_flip($client_options)) - ); + if ($client_options) { + $client_config = array_intersect_key($options, array_flip($client_options)); + } + // if set httpClientConfig, override the previous options + if (isset($options['httpClientConfig'])) { + $client_options = $this->getAllowedClientOptions($options['httpClientConfig']); + $client_config = array_intersect_key($options['httpClientConfig'], array_flip($client_options)); + } + $collaborators['httpClient'] = new HttpClient($client_config); } $this->setHttpClient($collaborators['httpClient']); diff --git a/test/src/Provider/AbstractProviderTest.php b/test/src/Provider/AbstractProviderTest.php index 4bd54209..1c1c83af 100644 --- a/test/src/Provider/AbstractProviderTest.php +++ b/test/src/Provider/AbstractProviderTest.php @@ -135,6 +135,67 @@ public function testCanDisableVerificationIfThereIsAProxy() $this->assertFalse($config['verify']); } + public function testConstructorSetsHttpClientConfig() + { + $timeout = rand(100, 900); + + $httpClientConfig = [ + 'timeout' => $timeout, + ]; + $mockProvider = new MockProvider(['httpClientConfig' => $httpClientConfig]); + + $config = $mockProvider->getHttpClient()->getConfig(); + + $this->assertContains('timeout', $config); + $this->assertEquals($timeout, $config['timeout']); + } + + public function testCanSetAProxyInHttpClientConfig() + { + $proxy = '192.168.0.1:8888'; + $httpClientConfig = [ + 'proxy' => $proxy, + ]; + $mockProvider = new MockProvider(['httpClientConfig' => $httpClientConfig]); + + $config = $mockProvider->getHttpClient()->getConfig(); + + $this->assertContains('proxy', $config); + $this->assertEquals($proxy, $config['proxy']); + } + + public function testCannotDisableVerifyIfNoProxyInHttpClientConfig() + { + $httpClientConfig = [ + 'verify' => false, + ]; + $mockProvider = new MockProvider([$httpClientConfig]); + + $config = $mockProvider->getHttpClient()->getConfig(); + + $this->assertContains('verify', $config); + $this->assertTrue($config['verify']); + } + + public function testOptionsOverrideByHttpClientConfig() + { + $configTimeout = 20; + $optionsTimeout = 10; + $httpClientConfig = [ + 'timeout' => $configTimeout, + ]; + $options = [ + 'timeout' => $optionsTimeout, + 'httpClientConfig' => $httpClientConfig, + ]; + $mockProvider = new MockProvider($options); + + $config = $mockProvider->getHttpClient()->getConfig(); + + $this->assertContains('timeout', $config); + $this->assertEquals($configTimeout, $config['timeout']); + } + public function testConstructorSetsGrantFactory() { $mockAdapter = Phony::mock(GrantFactory::class)->get();