From df750c236c1ffb46d7aa1aade689626f6792b053 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 30 Jan 2004 12:08:18 +0000 Subject: [PATCH] Somewhat crude attempt at fixing the test 91 failures. I commit this now so that the automatic testing hosts will test these changes over the weekend. --- lib/sendf.c | 1 + lib/setup.h | 10 ++++++++++ lib/transfer.c | 26 ++++++++++++++++++++------ lib/urldata.h | 2 ++ 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/sendf.c b/lib/sendf.c index fe3cbb422..c9eb62f5f 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -420,6 +420,7 @@ int Curl_read(struct connectdata *conn, if(-1 == nread) { int err = Curl_ourerrno(); + conn->sockerror = err; #ifdef WIN32 if(WSAEWOULDBLOCK == err) #else diff --git a/lib/setup.h b/lib/setup.h index 20120d8a6..3ba33dd32 100644 --- a/lib/setup.h +++ b/lib/setup.h @@ -256,4 +256,14 @@ typedef struct in_addr Curl_ipconnect; #define IOCTL_3_ARGS #endif +#ifndef ECONNRESET +#ifdef WSAECONNRESET +#define ECONNRESET WSAECONNRESET +#else +/* This will effectively prevent the code from working in this particular + aspect, but it still compile fine! */ +#define ECONNRESET 10000 +#endif +#endif + #endif /* __CONFIG_H */ diff --git a/lib/transfer.c b/lib/transfer.c index eb0c99452..8e5d6abd3 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -1896,12 +1896,26 @@ CURLcode Curl_perform(struct SessionHandle *data) if(res == CURLE_OK) { res = Transfer(conn); /* now fetch that URL please */ - if(res == CURLE_OK) - /* - * We must duplicate the new URL here as the connection data - * may be free()ed in the Curl_done() function. - */ - newurl = conn->newurl?strdup(conn->newurl):NULL; + if(res == CURLE_OK) { + + if((conn->keep.bytecount == 0) && + (conn->sockerror == ECONNRESET) && + conn->bits.reuse) { + /* We got no data, the connection was reset and we did attempt + to re-use a connection. This smells like we were too fast to + re-use a connection that was closed when we wanted to read + from it. Bad luck. Let's simulate a redirect to the same URL + to retry! */ + infof(data, "Connection reset, retrying a fresh connect\n"); + newurl = strdup(conn->data->change.url); + } + else + /* + * We must duplicate the new URL here as the connection data + * may be free()ed in the Curl_done() function. + */ + newurl = conn->newurl?strdup(conn->newurl):NULL; + } else { /* The transfer phase returned error, we mark the connection to get * closed to prevent being re-used. This is becasue we can't diff --git a/lib/urldata.h b/lib/urldata.h index f4a923817..49a38dfb2 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -563,6 +563,8 @@ struct connectdata { single requests! */ struct ntlmdata proxyntlm; /* NTLM data for proxy */ + int sockerror; /* errno stored by Curl_read() if the underlying layer returns + error */ #ifdef USE_ARES /* data used for the asynch name resolve callback */ struct Curl_async async;