diff --git a/system/HTTP/CURLRequest.php b/system/HTTP/CURLRequest.php index 92ab3946b90c..90261a2d051a 100644 --- a/system/HTTP/CURLRequest.php +++ b/system/HTTP/CURLRequest.php @@ -649,6 +649,17 @@ protected function setCURLOptions(array $curlOptions = [], array $config = []) $this->setHeader('Content-Length', (string) strlen($json)); } + // Resolve IP + if (array_key_exists('force_ip_resolve', $config) && is_string($config['force_ip_resolve']) && $config['force_ip_resolve'] !== '') { + $protocolVersion = $config['force_ip_resolve']; + + if ($protocolVersion === 'v4') { + $curlOptions[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V4; + } elseif ($protocolVersion === 'v6') { + $curlOptions[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6; + } + } + // version if (! empty($config['version'])) { $version = sprintf('%.1F', $config['version']); diff --git a/tests/system/HTTP/CURLRequestTest.php b/tests/system/HTTP/CURLRequestTest.php index 32415c86d3ee..1a8e5657a33c 100644 --- a/tests/system/HTTP/CURLRequestTest.php +++ b/tests/system/HTTP/CURLRequestTest.php @@ -1172,6 +1172,41 @@ public function testHTTPv3(): void $this->assertSame(CURL_HTTP_VERSION_3, $options[CURLOPT_HTTP_VERSION]); } + public function testForceResolveIPv4(): void + { + $this->request->request('POST', '/post', [ + 'force_ip_resolve' => 'v4', + ]); + + $options = $this->request->curl_options; + + $this->assertArrayHasKey(CURLOPT_IPRESOLVE, $options); + $this->assertSame(CURL_IPRESOLVE_V4, $options[CURLOPT_IPRESOLVE]); + } + + public function testForceResolveIPv6(): void + { + $this->request->request('POST', '/post', [ + 'force_ip_resolve' => 'v6', + ]); + + $options = $this->request->curl_options; + + $this->assertArrayHasKey(CURLOPT_IPRESOLVE, $options); + $this->assertSame(CURL_IPRESOLVE_V6, $options[CURLOPT_IPRESOLVE]); + } + + public function testForceResolveIPUnknown(): void + { + $this->request->request('POST', '/post', [ + 'force_ip_resolve' => 'v?', + ]); + + $options = $this->request->curl_options; + + $this->assertArrayNotHasKey(CURLOPT_IPRESOLVE, $options); + } + public function testCookieOption(): void { $holder = SUPPORTPATH . 'HTTP/Files/CookiesHolder.txt'; diff --git a/user_guide_src/source/libraries/curlrequest.rst b/user_guide_src/source/libraries/curlrequest.rst index 1e06b69cc484..49540613e1cc 100644 --- a/user_guide_src/source/libraries/curlrequest.rst +++ b/user_guide_src/source/libraries/curlrequest.rst @@ -364,6 +364,15 @@ is true: .. _curlrequest-version: +force_ip_resolve +================ + +.. versionadded:: 4.6.0 + +To set the HTTP handlers to use ``v4`` only ipv4 protocol or ``v6`` for ipv6 protocol: + +.. literalinclude:: curlrequest/036.php + version ======= diff --git a/user_guide_src/source/libraries/curlrequest/036.php b/user_guide_src/source/libraries/curlrequest/036.php new file mode 100644 index 000000000000..a02787d184bb --- /dev/null +++ b/user_guide_src/source/libraries/curlrequest/036.php @@ -0,0 +1,4 @@ +request('GET', '/', ['force_ip_resolve' => 'v4']); // v4 or v6