diff options
author | Daniel Stenberg <daniel@haxx.se> | 2007-11-03 14:44:38 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2007-11-03 14:44:38 +0000 |
commit | 51009a40b403230cc4d70f51daf74ffe96e7758f (patch) | |
tree | 8c7684f69a5ffe6b77c146669f93f9ff5f745060 | |
parent | 2ec8f77f2121f710638aa0e9903424bb608176ab (diff) |
make sure the code deals with failures on the DO_MORE state properly
-rw-r--r-- | lib/multi.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/lib/multi.c b/lib/multi.c index f9fcac12e..b4ca522dd 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -935,28 +935,28 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* Add this handle to the send pipeline */ easy->result = Curl_addHandleToPipeline(easy->easy_handle, easy->easy_conn->send_pipe); - if(CURLE_OK == easy->result) { - if(async) - /* We're now waiting for an asynchronous name lookup */ - multistate(easy, CURLM_STATE_WAITRESOLVE); - else { - /* after the connect has been sent off, go WAITCONNECT unless the - protocol connect is already done and we can go directly to - WAITDO! */ - result = CURLM_CALL_MULTI_PERFORM; - - if(protocol_connect) - multistate(easy, CURLM_STATE_WAITDO); - else { + if(CURLE_OK == easy->result) { + if(async) + /* We're now waiting for an asynchronous name lookup */ + multistate(easy, CURLM_STATE_WAITRESOLVE); + else { + /* after the connect has been sent off, go WAITCONNECT unless the + protocol connect is already done and we can go directly to + WAITDO! */ + result = CURLM_CALL_MULTI_PERFORM; + + if(protocol_connect) + multistate(easy, CURLM_STATE_WAITDO); + else { #ifndef CURL_DISABLE_HTTP - if (easy->easy_conn->bits.tunnel_connecting) - multistate(easy, CURLM_STATE_WAITPROXYCONNECT); - else + if (easy->easy_conn->bits.tunnel_connecting) + multistate(easy, CURLM_STATE_WAITPROXYCONNECT); + else #endif - multistate(easy, CURLM_STATE_WAITCONNECT); - } - } - } + multistate(easy, CURLM_STATE_WAITCONNECT); + } + } + } } break; @@ -1057,7 +1057,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, /* protocol-specific connect phase */ easy->result = Curl_protocol_connecting(easy->easy_conn, &protocol_connect); - if(protocol_connect) { + if((easy->result == CURLE_OK) && protocol_connect) { /* after the connect has completed, go WAITDO */ multistate(easy, CURLM_STATE_WAITDO); result = CURLM_CALL_MULTI_PERFORM; @@ -1181,15 +1181,20 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, if(CURLE_OK == easy->result) easy->result = Curl_readwrite_init(easy->easy_conn); - else - /* Remove ourselves from the send pipeline */ - Curl_removeHandleFromPipeline(easy->easy_handle, - easy->easy_conn->send_pipe); + + /* No need to remove ourselves from the send pipeline here since that + is done for us in Curl_done() */ if(CURLE_OK == easy->result) { multistate(easy, CURLM_STATE_DO_DONE); result = CURLM_CALL_MULTI_PERFORM; } + else { + /* failure detected */ + Curl_posttransfer(easy->easy_handle); + Curl_done(&easy->easy_conn, easy->result, FALSE); + disconnect_conn = TRUE; + } } break; |