diff --git a/src/Symfony/Component/HttpClient/HttpClientTrait.php b/src/Symfony/Component/HttpClient/HttpClientTrait.php index c8351f55bc2ba..1f5dc4d012756 100644 --- a/src/Symfony/Component/HttpClient/HttpClientTrait.php +++ b/src/Symfony/Component/HttpClient/HttpClientTrait.php @@ -23,6 +23,7 @@ trait HttpClientTrait { private static $CHUNK_SIZE = 16372; + private static $emptyDefaults; /** * Validates and normalizes method, URL and options, and merges them with defaults. @@ -40,6 +41,16 @@ private static function prepareRequest(?string $method, ?string $url, array $opt } } + if (null === self::$emptyDefaults) { + self::$emptyDefaults = []; + + foreach ($defaultOptions as $k => $v) { + if (null !== $v) { + self::$emptyDefaults[$k] = $v; + } + } + } + $options = self::mergeDefaultOptions($options, $defaultOptions, $allowExtraOptions); $buffer = $options['buffer'] ?? true; @@ -189,6 +200,16 @@ private static function mergeDefaultOptions(array $options, array $defaultOption $options += $defaultOptions; + if (null === self::$emptyDefaults) { + self::$emptyDefaults = []; + } + + foreach (self::$emptyDefaults as $k => $v) { + if (!isset($options[$k])) { + $options[$k] = $v; + } + } + if (isset($defaultOptions['extra'])) { $options['extra'] += $defaultOptions['extra']; } @@ -221,9 +242,9 @@ private static function mergeDefaultOptions(array $options, array $defaultOption $alternatives = []; - foreach ($defaultOptions as $key => $v) { - if (levenshtein($name, $key) <= \strlen($name) / 3 || str_contains($key, $name)) { - $alternatives[] = $key; + foreach ($defaultOptions as $k => $v) { + if (levenshtein($name, $k) <= \strlen($name) / 3 || str_contains($k, $name)) { + $alternatives[] = $k; } } diff --git a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php index e932470d2a98c..dd5bef04d08ae 100644 --- a/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php +++ b/src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php @@ -148,6 +148,17 @@ public function testHandleIsReinitOnReset() self::assertNotSame($initialShareId, $clientState->share); } + public function testNullBody() + { + $httpClient = $this->getHttpClient(__FUNCTION__); + + $httpClient->request('POST', 'http://localhost:8057/post', [ + 'body' => null, + ]); + + $this->expectNotToPerformAssertions(); + } + public function testProcessAfterReset() { $client = $this->getHttpClient(__FUNCTION__);