Skip to content

Commit

Permalink
url.c: fix HTTP CONNECT tunnel establishment upon delayed response
Browse files Browse the repository at this point in the history
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
  • Loading branch information
yangtse committed Jan 17, 2013
1 parent 4ed6b07 commit 9fd88ab
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions lib/url.c
Expand Up @@ -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;

Expand All @@ -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? */

Expand Down Expand Up @@ -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 */

Expand Down

0 comments on commit 9fd88ab

Please sign in to comment.