From: Daniel Stenberg Date: Wed, 31 Oct 2001 15:13:19 +0000 (+0000) Subject: If Curl_do() fails with CURLE_WRITE_ERROR on a re-used connection, this X-Git-Tag: curl-7_9_1~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=542055074b588ff700ddb31bedf6b4caa76a7e5d;p=thirdparty%2Fcurl.git 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! --- 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 */