more resilient connection times among IP addresses
When connecting to a domain with multiple IP addresses, allow different, decreasing connection timeout values. This should guarantee some connections attempts with sufficiently long timeouts, while still providing fallback.
This commit is contained in:
parent
4d2737bcb2
commit
f4d3c0cbfb
@ -732,6 +732,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
next:
|
next:
|
||||||
|
|
||||||
|
conn->timeoutms_per_addr = conn->ip_addr->ai_next == NULL ?
|
||||||
|
allow : allow / 2;
|
||||||
code = trynextip(conn, sockindex, connected);
|
code = trynextip(conn, sockindex, connected);
|
||||||
|
|
||||||
if(code) {
|
if(code) {
|
||||||
@ -1012,9 +1014,7 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
return CURLE_OPERATION_TIMEDOUT;
|
return CURLE_OPERATION_TIMEDOUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Max time for each address */
|
|
||||||
conn->num_addr = Curl_num_addresses(remotehost->addr);
|
conn->num_addr = Curl_num_addresses(remotehost->addr);
|
||||||
conn->timeoutms_per_addr = timeout_ms / conn->num_addr;
|
|
||||||
|
|
||||||
ai = remotehost->addr;
|
ai = remotehost->addr;
|
||||||
|
|
||||||
@ -1026,14 +1026,17 @@ CURLcode Curl_connecthost(struct connectdata *conn, /* context */
|
|||||||
* Connecting with a Curl_addrinfo chain
|
* Connecting with a Curl_addrinfo chain
|
||||||
*/
|
*/
|
||||||
for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) {
|
for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) {
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
/* Max time for the next address */
|
||||||
|
conn->timeoutms_per_addr = curr_addr->ai_next == NULL ?
|
||||||
|
timeout_ms : timeout_ms / 2;
|
||||||
|
|
||||||
/* start connecting to the IP curr_addr points to */
|
/* start connecting to the IP curr_addr points to */
|
||||||
CURLcode res =
|
res = singleipconnect(conn, curr_addr,
|
||||||
singleipconnect(conn, curr_addr,
|
/* don't hang when doing multi */
|
||||||
/* don't hang when doing multi */
|
(data->state.used_interface == Curl_if_multi)?0:
|
||||||
(data->state.used_interface == Curl_if_multi)?0:
|
conn->timeoutms_per_addr, &sockfd, connected);
|
||||||
conn->timeoutms_per_addr, &sockfd, connected);
|
|
||||||
|
|
||||||
if(res)
|
if(res)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user