diff options
author | Daniel Stenberg <daniel@haxx.se> | 2014-07-19 23:58:58 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2014-07-22 23:00:19 +0200 |
commit | a4cece3d47cf092da00cf9910e87bb60b9eff533 (patch) | |
tree | 0655fd947c08bd67a3ce7ffb9d751e74dfb80af5 /lib/multi.c | |
parent | d242839af8511b389f0edd6519bdae6cd860e8a9 (diff) |
CONNECT: Revert Curl_proxyCONNECT back to 7.29.0 design
This reverts commit cb3e6dfa3511 and instead fixes the problem
differently.
The reverted commit addressed a test failure in test 1021 by simplifying
and generalizing the code flow in a way that damaged the
performance. Now we modify the flow so that Curl_proxyCONNECT() again
does as much as possible in one go, yet still do test 1021 with and
without valgrind. It failed due to mistakes in the multi state machine.
Bug: http://curl.haxx.se/bug/view.cgi?id=1397
Reported-by: Paul Saab
Diffstat (limited to 'lib/multi.c')
-rw-r--r-- | lib/multi.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/multi.c b/lib/multi.c index ca975a056..1e5b3c8df 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -1137,11 +1137,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, data->result = Curl_http_connect(data->easy_conn, &protocol_connect); if(data->easy_conn->bits.proxy_connect_closed) { - /* reset the error buffer */ - if(data->set.errorbuffer) - data->set.errorbuffer[0] = '\0'; - data->state.errorbuf = FALSE; - + /* connect back to proxy again */ data->result = CURLE_OK; result = CURLM_CALL_MULTI_PERFORM; multistate(data, CURLM_STATE_CONNECT); @@ -1167,7 +1163,15 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, &protocol_connect); } - if(CURLE_OK != data->result) { + if(data->easy_conn->bits.proxy_connect_closed) { + /* connect back to proxy again since it was closed in a proxy CONNECT + setup */ + data->result = CURLE_OK; + result = CURLM_CALL_MULTI_PERFORM; + multistate(data, CURLM_STATE_CONNECT); + break; + } + else if(CURLE_OK != data->result) { /* failure detected */ /* Just break, the cleaning up is handled all in one place */ disconnect_conn = TRUE; |