8000 [HttpClient] made `HttpClient::create()` return an `AmpHttpClient` wh… · symfony/symfony@5b1c137 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5b1c137

Browse files
[HttpClient] made HttpClient::create() return an AmpHttpClient when amphp/http-client is found but curl is not or too old
1 parent f632b76 commit 5b1c137

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/Symfony/Component/HttpClient/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CHANGELOG
77
* added `NoPrivateNetworkHttpClient` decorator
88
* added `AmpHttpClient`, a portable HTTP/2 implementation based on Amp
99
* added `LoggerAwareInterface` to `ScopingHttpClient` and `TraceableHttpClient`
10+
* made `HttpClient::create()` return an `AmpHttpClient` when `amphp/http-client` is found but curl is not or too old
1011

1112
4.4.0
1213
-----

src/Symfony/Component/HttpClient/HttpClient.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\HttpClient;
1313

14+
use Amp\Http\Client\Connection\ConnectionLimitingPool;
1415
use Symfony\Contracts\HttpClient\HttpClientInterface;
1516

1617
/**
@@ -29,6 +30,25 @@ final class HttpClient
2930
*/
3031
public static function create(array $defaultOptions = [], int $maxHostConnections = 6, int $maxPendingPushes = 50): HttpClientInterface
3132
{
33+
if ($amp = class_exists(ConnectionLimitingPool::class)) {
34+
if (!\extension_loaded('curl')) {
35+
return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes);
36+
}
37+
38+
// Skip curl when HTTP/2 push is unsupported or buggy, see https://bugs.php.net/77535
39+
if (\PHP_VERSION_ID < 70217 || (\PHP_VERSION_ID >= 70300 && \PHP_VERSION_ID < 70304) || !\defined('CURLMOPT_PUSHFUNCTION')) {
40+
return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes);
41+
}
42+
43+
static $curlVersion = null;
44+
$curlVersion = $curlVersion ?? curl_version();
45+
46+
// HTTP/2 push crashes before curl 7.61
47+
if (0x073d00 > $curlVersion['version_number'] || !(CURL_VERSION_HTTP2 & $curlVersion['features'])) {
48+
return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes);
49+
}
50+
}
51+
3252
if (\extension_loaded('curl')) {
3353
if ('\\' !== \DIRECTORY_SEPARATOR || ini_get('curl.cainfo') || ini_get('openssl.cafile') || ini_get('openssl.capath')) {
3454
return new CurlHttpClient($defaultOptions, $maxHostConnections, $maxPendingPushes);
@@ -37,6 +57,10 @@ public static function create(array $defaultOptions = [], int $maxHostConnection
3757
@trigger_error('Configure the "curl.cainfo", "openssl.cafile" or "openssl.capath" php.ini setting to enable the CurlHttpClient', E_USER_WARNING);
3858
}
3959

60+
if ($amp) {
61+
return new AmpHttpClient($defaultOptions, null, $maxHostConnections, $maxPendingPushes);
62+
}
63+
4064
return new NativeHttpClient($defaultOptions, $maxHostConnections);
4165
}
4266

0 commit comments

Comments
 (0)
0