]> granicus.if.org Git - curl/commitdiff
more resilient connection times among IP addresses
authorPierre Ynard <linkfanel@yahoo.fr>
Mon, 23 Jan 2012 09:45:24 +0000 (10:45 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 28 Jan 2012 13:00:52 +0000 (14:00 +0100)
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.

lib/connect.c

index 582782e5c531bc4a1885750783e6df78187bbf05..b5082d896c930c8eea0e519d413ed44081e49435 100644 (file)
@@ -732,6 +732,8 @@ CURLcode Curl_is_connected(struct connectdata *conn,
   }
   next:
 
+  conn->timeoutms_per_addr = conn->ip_addr->ai_next == NULL ?
+                             allow : allow / 2;
   code = trynextip(conn, sockindex, connected);
 
   if(code) {
@@ -1012,9 +1014,7 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
     return CURLE_OPERATION_TIMEDOUT;
   }
 
-  /* Max time for each address */
   conn->num_addr = Curl_num_addresses(remotehost->addr);
-  conn->timeoutms_per_addr = timeout_ms / conn->num_addr;
 
   ai = remotehost->addr;
 
@@ -1026,14 +1026,17 @@ CURLcode Curl_connecthost(struct connectdata *conn,  /* context */
    * Connecting with a Curl_addrinfo chain
    */
   for(curr_addr = ai; curr_addr; curr_addr = curr_addr->ai_next) {
+    CURLcode res;
 
-    /* start connecting to the IP curr_addr points to */
-    CURLcode res =
-      singleipconnect(conn, curr_addr,
-                      /* don't hang when doing multi */
-                      (data->state.used_interface == Curl_if_multi)?0:
-                      conn->timeoutms_per_addr, &sockfd, connected);
+    /* 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 */
+    res = singleipconnect(conn, curr_addr,
+                          /* don't hang when doing multi */
+                          (data->state.used_interface == Curl_if_multi)?0:
+                          conn->timeoutms_per_addr, &sockfd, connected);
     if(res)
       return res;