aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-01-30 12:08:18 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-01-30 12:08:18 +0000
commitdf750c236c1ffb46d7aa1aade689626f6792b053 (patch)
tree099312e8e1376016fa5abe5e2de7337e3d3946b2
parent154c9bc3b88703316b1ff5c6c2230b41718d6c43 (diff)
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.
-rw-r--r--lib/sendf.c1
-rw-r--r--lib/setup.h10
-rw-r--r--lib/transfer.c26
-rw-r--r--lib/urldata.h2
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;