diff options
-rw-r--r-- | CHANGES | 5 | ||||
-rw-r--r-- | RELEASE-NOTES | 2 | ||||
-rw-r--r-- | lib/http.c | 11 | ||||
-rw-r--r-- | tests/data/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/test287 | 45 |
5 files changed, 60 insertions, 5 deletions
@@ -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 @@ +<testcase> +# Server-side +<reply> + +# this is returned first since we get no proxy-auth +<data nocheck="1"> +HTTP/1.1 405 Method Not Allowed swsclose
+
+And you should ignore this data. +</data> + +</reply> + +# Client-side +<client> +<server> +http +</server> + <name> +HTTP proxy CONNECT with custom User-Agent header + </name> + <command> +http://test.remote.server.com:287/path/287 -H "User-Agent: looser/2007" --proxy http://%HOSTIP:%HTTPPORT --proxytunnel +</command> +</client> + +# Verify data after the test has been "shot" +<verify> +<protocol> +CONNECT test.remote.server.com:287 HTTP/1.0
+Host: test.remote.server.com:287
+Proxy-Connection: Keep-Alive
+User-Agent: looser/2007
+
+</protocol> +# CURLE_RECV_ERROR +<errorcode> +56 +</errorcode> +<stdout> +HTTP/1.1 405 Method Not Allowed swsclose
+
+</stdout> +</verify> +</testcase> |