Skip to content

Commit

Permalink
bug #36377 [HttpClient] Fix scoped client without query option config…
Browse files Browse the repository at this point in the history
…uration (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
-------

a07578d [HttpClient] Fix scoped client without query option configuration
  • Loading branch information
nicolas-grekas committed Apr 10, 2020
2 parents 6f19746 + a07578d commit 977276e
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 1 deletion.
Expand Up @@ -1482,7 +1482,7 @@ private function addHttpClientSection(ArrayNodeDefinition $rootNode)
->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()
Expand Down
@@ -0,0 +1,11 @@
<?php

$container->loadFromExtension('framework', [
'http_client' => [
'scoped_clients' => [
'foo' => [
'scope' => '.*',
],
],
],
]);
@@ -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>
@@ -0,0 +1,5 @@
framework:
http_client:
scoped_clients:
foo:
scope: '.*'
Expand Up @@ -1547,6 +1547,14 @@ public function testHttpClientDefaultOptions()
$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');
Expand Down

0 comments on commit 977276e

Please sign in to comment.