bug #36377 [HttpClient] Fix scoped client without query option configuration (X-Coder264)

This PR was merged into the 4.4 branch.

Discussion
----------

[HttpClient] Fix scoped client without query option configuration

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       |
| License       | MIT
| Doc PR        |

The `query` key default value is an [empty array](https://github.com/symfony/symfony/blob/v4.4.7/src/Symfony/Component/Config/Definition/PrototypedArrayNode.php#L30) and because of that it is always set. Processing a configuration for a scoped HTTP client (which has a `scope` and does not have a `base_uri`) results in the configuration being invalid. The error message says that query parameters cannot be aplied to the base URI since it is not defined (which doesn't make sense since the query parameters don't exist because they are empty).

Commits
-------

a07578dba3 [HttpClient] Fix scoped client without query option configuration
This commit is contained in:
Nicolas Grekas 2020-04-10 23:11:29 +02:00
commit 977276efa4
5 changed files with 41 additions and 1 deletions

View File

@ -1482,7 +1482,7 @@ class Configuration implements ConfigurationInterface
->thenInvalid('Either "scope" or "base_uri" should be defined.')
->end()
->validate()
->ifTrue(function ($v) { return isset($v['query']) && !isset($v['base_uri']); })
->ifTrue(function ($v) { return !empty($v['query']) && !isset($v['base_uri']); })
->thenInvalid('"query" applies to "base_uri" but no base URI is defined.')
->end()
->children()

View File

@ -0,0 +1,11 @@
<?php
$container->loadFromExtension('framework', [
'http_client' => [
'scoped_clients' => [
'foo' => [
'scope' => '.*',
],
],
],
]);

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:framework="http://symfony.com/schema/dic/symfony"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
<framework:config>
<framework:http-client>
<framework:scoped-client
name="foo"
scope=".*"
/>
</framework:http-client>
</framework:config>
</container>

View File

@ -0,0 +1,5 @@
framework:
http_client:
scoped_clients:
foo:
scope: '.*'

View File

@ -1547,6 +1547,14 @@ abstract class FrameworkExtensionTest extends TestCase
$this->assertSame(ScopingHttpClient::class, $container->getDefinition('foo')->getClass());
}
public function testScopedHttpClientWithoutQueryOption()
{
$container = $this->createContainerFromFile('http_client_scoped_without_query_option');
$this->assertTrue($container->hasDefinition('foo'), 'should have the "foo" service.');
$this->assertSame(ScopingHttpClient::class, $container->getDefinition('foo')->getClass());
}
public function testHttpClientOverrideDefaultOptions()
{
$container = $this->createContainerFromFile('http_client_override_default_options');