Bug #74135 [Com]: CURLOPT_RESOLVE don't work properly in second time curl call

From: Date: Wed, 01 Mar 2017 16:37:38 +0000
Subject: Bug #74135 [Com]: CURLOPT_RESOLVE don't work properly in second time curl call
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-207639@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=74135&edit=1 ID: 74135 Comment by: andrew dot nester dot dev at gmail dot com Reported by: icez at icez dot net Summary: CURLOPT_RESOLVE don't work properly in second time curl call Status: Open Type: Bug Package: cURL related Operating System: Linux Debian Jessie PHP Version: 7.0.16 Block user comment: N Private report: N New Comment: 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; Previous Comments: ------------------------------------------------------------------------ [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

« previous php.bugs (#207639) next »