Edit report at https://bugs.php.net/bug.php?id=74135&edit=1
ID: 74135
Updated by: mike@php.net
Reported by: icez at icez dot net
Summary: CURLOPT_RESOLVE don't work properly in second time
curl call
-Status: Open
+Status: Not a bug
Type: Bug
Package: cURL related
Operating System: Linux Debian Jessie
PHP Version: 7.0.16
Block user comment: N
Private report: N
New Comment:
Cannot reproduce either.
* Added example.com:443:192.0.2.1 to DNS cache
* Hostname example.com was found in DNS cache
* Trying 192.0.2.1...
* TCP_NODELAY set
* Connection timed out after 1001 milliseconds
* Closing connection 0
* Added example.com:443:192.0.2.2 to DNS cache
* Hostname example.com was found in DNS cache
* Trying 192.0.2.2...
* TCP_NODELAY set
* Connection timed out after 1001 milliseconds
* Closing connection 0
* Added example.com:443:192.0.2.3 to DNS cache
* Hostname example.com was found in DNS cache
* Trying 192.0.2.3...
* TCP_NODELAY set
* Connection timed out after 1001 milliseconds
* Closing connection 0
Previous Comments:
------------------------------------------------------------------------
[2017-03-01 16:37:32] andrew dot nester dot dev at gmail dot com
It's a bit tricky but isn't related to PHP Curl lib.
According to libcurl documentation (https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html)
"Remove names from the DNS cache again, to stop providing these fake resolves, by including a
string in the linked list that uses the format "-HOST:PORT". The host name must be
prefixed with a dash, and the host name and port number must exactly match what was already added
previously."
so you can use something as following to perform what you want:
$resolveparam = [ $prev_server ? '-example.com:443:'.$prev_server : '',
'example.com:443:'.$server ];
$prev_server = $server;
------------------------------------------------------------------------
[2017-02-20 16:13:20] icez at icez dot net
sorry, missing one line in the test script:
Here's the correct one:
-------------------
$servers = [ '192.0.2.1', '192.0.2.2', '192.0.2.3' ];
foreach ($servers as $server) {
$resolveparam = [ 'example.com:443:'.$server ];
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_RESOLVE, $resolveparam);
curl_setopt($ch, CURLOPT_URL, "https://example.com/some/path");
curl_setopt($ch, CURLOPT_VERBOSE, 1);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info['primary_ip']."\n";
curl_close($ch);
}
------------------------------------------------------------------------
[2017-02-20 16:10:42] icez at icez dot net
Description:
------------
I have the code that call several servers behind the load balancer to check for the page load
result. The server was configured with SSL so I need the way to force curl to connect to specific IP
address with the correct hostname without having to set SSL_VERIFYHOST to false and found curl
option CURLOPT_RESOLVE. I've tested that curl command line can use this option to force connect
to specific server IP address, but when I run the test script in PHP it always connect to first
server. which is the first address to have this option set to.
related question: http://stackoverflow.com/questions/36434049/php-curl-curlopt-resolve-not-working
Test script:
---------------
$servers = [ '192.0.2.1', '192.0.2.2', '192.0.2.3' ];
foreach ($servers as $server) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_RESOLVE, $resolveparam);
curl_setopt($ch, CURLOPT_URL, "https://example.com/some/path");
curl_setopt($ch, CURLOPT_VERBOSE, 1);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
echo $info['primary_ip']."\n";
curl_close($ch);
}
Expected result:
----------------
192.0.2.1
192.0.2.2
192.0.2.3
Actual result:
--------------
192.0.2.1
192.0.2.1
192.0.2.1
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=74135&edit=1