aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Stenberg <bjorn@haxx.se>2013-10-29 14:43:01 +0100
committerDaniel Stenberg <daniel@haxx.se>2013-10-29 22:52:07 +0100
commit255826c40f9316dbd0319853a791bc8079c5dd20 (patch)
tree52ac00f4bcd23a388d7b010803fe5832bcf0378a
parent1d0eead969aafe491adbd48624cd57a6ee0b72e7 (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.c25
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;
}