diff --git a/CHANGES b/CHANGES index 4249a58da..f3b197162 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,11 @@ Changelog +Daniel (29 January 2007) +- Michael Wallner reported that when doing a CONNECT with a custom User-Agent + header, you got _two_ User-Agent headers in the CONNECT request...! Added + test case 287 to verify the fix. + Daniel (28 January 2007) - curl_easy_reset() now resets the CA bundle path correctly. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index c3a9da4ff..d14582827 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -80,6 +80,6 @@ advice from friends like these: Stefan Krause, Sebastien Willemijns, Alexey Simak, Brendan Jurd, Robson Braga Araujo, David McCreedy, Robert Foreman, Nathanael Nerode, Victor Snezhko, Linus Nielsen Feltzing, Toby Peterson, Dan Fandrich, - Armel Asselin + Armel Asselin, Michael Wallner, Guenter Knauf Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/http.c b/lib/http.c index 89509491f..c07053bdd 100644 --- a/lib/http.c +++ b/lib/http.c @@ -1101,6 +1101,8 @@ Curl_compareheader(char *headerline, /* line to check */ * like any ordinary HTTP request, and not specially crafted like this. This * function only remains here like this for now since the rewrite is a bit too * much work to do at the moment. + * + * This function is BLOCKING which is nasty for all multi interface using apps. */ CURLcode Curl_proxyCONNECT(struct connectdata *conn, @@ -1160,15 +1162,18 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, if(CURLE_OK == result) { char *host=(char *)""; const char *proxyconn=""; + const char *useragent=""; if(!checkheaders(data, "Host:")) { host = aprintf("Host: %s\r\n", host_port); if(!host) result = CURLE_OUT_OF_MEMORY; } - if(!checkheaders(data, "Proxy-Connection:")) { + if(!checkheaders(data, "Proxy-Connection:")) proxyconn = "Proxy-Connection: Keep-Alive\r\n"; - } + + if(!checkheaders(data, "User-Agent:") && data->set.useragent) + useragent = conn->allocptr.uagent; if(CURLE_OK == result) { /* Send the connect request to the proxy */ @@ -1184,7 +1189,7 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, host, conn->allocptr.proxyuserpwd? conn->allocptr.proxyuserpwd:"", - data->set.useragent?conn->allocptr.uagent:"", + useragent, proxyconn); if(CURLE_OK == result) diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 37078bafa..c8c36bedb 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -37,4 +37,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \ test274 test275 test524 test525 test276 test277 test526 test527 test528 \ test530 DISABLED test278 test279 test531 test280 test529 test532 test533 \ test534 test535 test281 test537 test282 test283 test284 test538 test285 \ - test286 test307 test308 + test286 test307 test308 test287 diff --git a/tests/data/test287 b/tests/data/test287 new file mode 100644 index 000000000..c67818cd0 --- /dev/null +++ b/tests/data/test287 @@ -0,0 +1,45 @@ + +# Server-side + + +# this is returned first since we get no proxy-auth + +HTTP/1.1 405 Method Not Allowed swsclose + +And you should ignore this data. + + + + +# Client-side + + +http + + +HTTP proxy CONNECT with custom User-Agent header + + +http://test.remote.server.com:287/path/287 -H "User-Agent: looser/2007" --proxy http://%HOSTIP:%HTTPPORT --proxytunnel + + + +# Verify data after the test has been "shot" + + +CONNECT test.remote.server.com:287 HTTP/1.0 +Host: test.remote.server.com:287 +Proxy-Connection: Keep-Alive +User-Agent: looser/2007 + + +# CURLE_RECV_ERROR + +56 + + +HTTP/1.1 405 Method Not Allowed swsclose + + + +