summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2013-01-17 17:07:19 +0100
committerYang Tse <yangsita@gmail.com>2013-01-17 17:07:19 +0100
commit9fd88abb7032346e88636165e688232e36f5c336 (patch)
treec5fd7d8226fadcfa44aa6e3f40deca282b1241ad
parent4ed6b07d8dbf6a61aeba1eb8ac802f0b6a65c082 (diff)
downloadcurl-9fd88abb7032346e88636165e688232e36f5c336.tar.gz
url.c: fix HTTP CONNECT tunnel establishment upon delayed response
Fixes initial proxy response being processed by the tunneled protocol handler instead of the HTTP wrapper handler. This issue would trigger upon delayed CONNECT response from the proxy. Additionally fixes a multi interface code-path in which connections would not time out properly. This does not fix known bug #39. URL: http://curl.haxx.se/mail/lib-2013-01/0191.html
-rw-r--r--lib/url.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/lib/url.c b/lib/url.c
index c107d2c51..8e07a791e 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -3237,7 +3237,6 @@ CURLcode Curl_protocol_connect(struct connectdata *conn,
bool *protocol_done)
{
CURLcode result=CURLE_OK;
- struct SessionHandle *data = conn->data;
*protocol_done = FALSE;
@@ -3254,19 +3253,18 @@ CURLcode Curl_protocol_connect(struct connectdata *conn,
return CURLE_OK;
}
- Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
- Curl_verboseconnect(conn);
-
if(!conn->bits.protoconnstart) {
- /* Set start time here for timeout purposes in the connect procedure, it
- is later set again for the progress meter purpose */
- conn->now = Curl_tvnow();
-
result = Curl_proxy_connect(conn);
if(result)
return result;
+ if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
+ (conn->tunnel_state[FIRSTSOCKET] != TUNNEL_COMPLETE))
+ /* when using an HTTP tunnel proxy, await complete tunnel establishment
+ before proceeding further. Return CURLE_OK so we'll be called again */
+ return CURLE_OK;
+
if(conn->handler->connect_it) {
/* is there a protocol-specific connect() procedure? */
@@ -5073,6 +5071,10 @@ CURLcode Curl_setup_conn(struct connectdata *conn,
data->state.crlf_conversions = 0; /* reset CRLF conversion counter */
#endif /* CURL_DO_LINEEND_CONV */
+ /* set start time here for timeout purposes in the connect procedure, it
+ is later set again for the progress meter purpose */
+ conn->now = Curl_tvnow();
+
for(;;) {
/* loop for CURL_SERVER_CLOSED_CONNECTION */