From 542055074b588ff700ddb31bedf6b4caa76a7e5d Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Wed, 31 Oct 2001 15:13:19 +0000
Subject: [PATCH] If Curl_do() fails with CURLE_WRITE_ERROR on a re-used
 connection, this new logic can retry the same operation on a new connection!

---
 lib/transfer.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/lib/transfer.c b/lib/transfer.c
index 5035c30379..01785f6917 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -922,6 +922,28 @@ CURLcode Curl_perform(struct SessionHandle *data)
     res = Curl_connect(data, &conn, port);
     if(res == CURLE_OK) {
       res = Curl_do(conn);
+
+      if((CURLE_WRITE_ERROR == res) && conn->bits.reuse) {
+        /* This was a re-use of a connection and we got a write error in the
+         * DO-phase. Then we DISCONNECT this connection and have another
+         * attempt to CONNECT and then DO again! The retry cannot possibly
+         * find another connection to re-use, since we only keep one possible
+         * connection for each.
+         */
+
+        infof(data, "The re-used connection seems dead, get a new one\n");
+
+        conn->bits.close = TRUE; /* enforce close of this connetion */
+        res = Curl_done(conn);   /* we are so done with this */
+        if(CURLE_OK == res) {
+          /* Now, redo the connect */
+          res = Curl_connect(data, &conn, port);
+          if(CURLE_OK == res)
+            /* ... finally back to actually retry the DO phase */
+            res = Curl_do(conn);
+        }
+      }
+
       if(res == CURLE_OK) {
         CURLcode res2; /* just a local extra result container */
 
-- 
GitLab