diff --git a/CHANGES b/CHANGES index b68d49bdb..67d727cf1 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,11 @@ Changelog +Daniel Stenberg (17 May 2009) +- James Bursa posted a patch to the mailing list that fixed a problem with + no_proxy which made it not skip the proxy if the URL entered contained a + user name. I added test case 1101 to verify. + Daniel Stenberg (11 May 2009) - Balint Szilakszi reported a memory leak when libcurl did gzip decompression of streams that had some parts (legitimately) missing. We now provide and use diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 57dcac95a..60324d119 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -47,6 +47,7 @@ This release includes the following bugfixes: o POST, NTLM and following a redirect hang o libcurl+NSS endless loop on incorrect password for private key o gzip decompression memory leak + o no_proxy flaw with user name in URL This release includes the following known bugs: @@ -61,6 +62,6 @@ advice from friends like these: Pramod Sharma, Gisle Vanem, Lenaic Lefever, Rainer Koenig, Sven Wegener, Tim Chen, Constantine Sapuntzakis, David McCreedy, Michael Smith, Colin Watson, Ebenezer Ikonne, Laurent Rabret, Michael Cronenworth, - Balint Szilakszi + Balint Szilakszi, James Bursa Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/url.c b/lib/url.c index ee67578bd..88f797296 100644 --- a/lib/url.c +++ b/lib/url.c @@ -4316,6 +4316,44 @@ static CURLcode create_conn(struct SessionHandle *data, return result; } + /************************************************************* + * No protocol part in URL was used, add it! + *************************************************************/ + if(conn->protocol&PROT_MISSING) { + /* We're guessing prefixes here and if we're told to use a proxy or if + we're gonna follow a Location: later or... then we need the protocol + part added so that we have a valid URL. */ + char *reurl; + + reurl = aprintf("%s://%s", conn->protostr, data->change.url); + + if(!reurl) { + Curl_safefree(proxy); + return CURLE_OUT_OF_MEMORY; + } + + data->change.url = reurl; + data->change.url_alloc = TRUE; /* free this later */ + conn->protocol &= ~PROT_MISSING; /* switch that one off again */ + } + + /************************************************************* + * Setup internals depending on protocol + *************************************************************/ + result = setup_connection_internals(data, conn); + if(result != CURLE_OK) { + Curl_safefree(proxy); + return result; + } + + /************************************************************* + * Parse a user name and password in the URL and strip it out + * of the host name + *************************************************************/ + result = parse_url_userpass(data, conn, user, passwd); + if(result != CURLE_OK) + return result; + #ifndef CURL_DISABLE_PROXY /************************************************************* * Extract the user and password from the authentication string @@ -4371,37 +4409,6 @@ static CURLcode create_conn(struct SessionHandle *data, } #endif /* CURL_DISABLE_PROXY */ - /************************************************************* - * No protocol part in URL was used, add it! - *************************************************************/ - if(conn->protocol&PROT_MISSING) { - /* We're guessing prefixes here and if we're told to use a proxy or if - we're gonna follow a Location: later or... then we need the protocol - part added so that we have a valid URL. */ - char *reurl; - - reurl = aprintf("%s://%s", conn->protostr, data->change.url); - - if(!reurl) { - Curl_safefree(proxy); - return CURLE_OUT_OF_MEMORY; - } - - data->change.url = reurl; - data->change.url_alloc = TRUE; /* free this later */ - conn->protocol &= ~PROT_MISSING; /* switch that one off again */ - } - - /************************************************************* - * Setup internals depending on protocol - *************************************************************/ - result = setup_connection_internals(data, conn); - if(result != CURLE_OK) { - Curl_safefree(proxy); - return result; - } - - #ifndef CURL_DISABLE_PROXY /*********************************************************************** * If this is supposed to use a proxy, we need to figure out the proxy @@ -4462,14 +4469,6 @@ static CURLcode create_conn(struct SessionHandle *data, if((conn->protocol&PROT_SSL) && conn->bits.httpproxy) conn->bits.tunnel_proxy = TRUE; - /************************************************************* - * Parse a user name and password in the URL and strip it out - * of the host name - *************************************************************/ - result = parse_url_userpass(data, conn, user, passwd); - if(result != CURLE_OK) - return result; - /************************************************************* * Figure out the remote port number and fix it in the URL *************************************************************/ diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 6574ab0ee..72afc5128 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -62,7 +62,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test635 test636 test637 test558 test559 test1086 test1087 test1088 \ test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096 \ test1097 test560 test561 test1098 test1099 test562 test563 test1100 \ - test564 + test564 test1101 filecheck: @mkdir test-place; \ diff --git a/tests/data/test1101 b/tests/data/test1101 new file mode 100644 index 000000000..5624e3121 --- /dev/null +++ b/tests/data/test1101 @@ -0,0 +1,53 @@ + + + +HTTP +HTTP GET +NO_PROXY + + +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake +Content-Length: 4 +Content-Type: text/html + +boo + + + +# Client-side + + +http + + +NO_PROXY test, with user name in URL + + + +no_proxy=%HOSTIP +http_proxy=http://non-existing-host.haxx.se:3128/ + + +http://user:secret@%HOSTIP:%HTTPPORT/gimme/1101 + + + +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET /gimme/1101 HTTP/1.1 +Authorization: Basic dXNlcjpzZWNyZXQ= +Host: %HOSTIP:%HTTPPORT +Accept: */* + + + +