diff options
author | Björn Stenberg <bjorn@haxx.se> | 2013-10-29 14:43:01 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2013-10-29 22:52:07 +0100 |
commit | 255826c40f9316dbd0319853a791bc8079c5dd20 (patch) | |
tree | 52ac00f4bcd23a388d7b010803fe5832bcf0378a | |
parent | 1d0eead969aafe491adbd48624cd57a6ee0b72e7 (diff) |
bugfix: Don't block waiting for socket1 connect.
This patch fixes a bug in Happy Eyeballs where curl would wait for a
connect response from socket1 before checking socket2.
Also, it updates error messages for failed connections, showing the ip
addresses that failed rather than just the host name repeatedly.
Bug: http://curl.haxx.se/mail/lib-2013-10/0236.html
Reported-by: Paul Marks
-rw-r--r-- | lib/connect.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/connect.c b/lib/connect.c index 93b21352e..2cf1fc051 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -747,9 +747,9 @@ CURLcode Curl_is_connected(struct connectdata *conn, if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) { infof(data, "After %ldms connect time, move on!\n", conn->timeoutms_per_addr); - break; + error = ETIMEDOUT; } - return CURLE_OK; + break; case CURL_CSELECT_OUT: if(verifyconnect(conn->tempsock[i], &error)) { @@ -802,22 +802,25 @@ CURLcode Curl_is_connected(struct connectdata *conn, * address" for the given host. But first remember the latest error. */ if(error) { + char ipaddress[MAX_IPADR_LEN]; data->state.os_errno = error; SET_SOCKERRNO(error); - } + Curl_printable_address(conn->tempaddr[i], ipaddress, MAX_IPADR_LEN); + infof(data, "connect to %s port %ld: %s\n", + ipaddress, conn->port, Curl_strerror(conn, error)); - conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ? - allow : allow / 2; - code = trynextip(conn, sockindex, i, connected); + conn->timeoutms_per_addr = conn->tempaddr[i]->ai_next == NULL ? + allow : allow / 2; - if(code) { - error = SOCKERRNO; - data->state.os_errno = error; - failf(data, "Failed connect to %s:%ld; %s", - conn->host.name, conn->port, Curl_strerror(conn, error)); + code = trynextip(conn, sockindex, i, connected); } } + if(code) { + /* no more addresses to try */ + failf(data, "Failed to connect to %s port %ld: %s", + conn->host.name, conn->port, Curl_strerror(conn, error)); + } return code; } |