Commit f4d3c0cb authored by Pierre Ynard's avatar Pierre Ynard Committed by Daniel Stenberg
Browse files

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.
parent 4d2737bc
Loading
Loading
Loading
Loading
+11 −8
Original line number Original line Diff line number Diff line
@@ -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;