diff --git a/lib/http_proxy.c b/lib/http_proxy.c index 7fde11dbb..a67328647 100644 --- a/lib/http_proxy.c +++ b/lib/http_proxy.c @@ -515,33 +515,34 @@ CURLcode Curl_proxyCONNECT(struct connectdata *conn, } else if(checkprefix("Content-Length:", line_start)) { if(k->httpcode/100 == 2) { - /* A server MUST NOT send any Transfer-Encoding or - Content-Length header fields in a 2xx (Successful) - response to CONNECT. (RFC 7231 section 4.3.6) */ - failf(data, "Content-Length: in %03d response", + /* A client MUST ignore any Content-Length or Transfer-Encoding + header fields received in a successful response to CONNECT. + "Successful" described as: 2xx (Successful). RFC 7231 4.3.6 */ + infof(data, "Ignoring Content-Length in CONNECT %03d response\n", k->httpcode); - return CURLE_RECV_ERROR; } - - cl = curlx_strtoofft(line_start + - strlen("Content-Length:"), NULL, 10); + else { + cl = curlx_strtoofft(line_start + + strlen("Content-Length:"), NULL, 10); + } } else if(Curl_compareheader(line_start, "Connection:", "close")) closeConnection = TRUE; - else if(Curl_compareheader(line_start, - "Transfer-Encoding:", - "chunked")) { + else if(checkprefix("Transfer-Encoding:", line_start)) { if(k->httpcode/100 == 2) { - /* A server MUST NOT send any Transfer-Encoding or - Content-Length header fields in a 2xx (Successful) - response to CONNECT. (RFC 7231 section 4.3.6) */ - failf(data, "Transfer-Encoding: in %03d response", k->httpcode); - return CURLE_RECV_ERROR; + /* A client MUST ignore any Content-Length or Transfer-Encoding + header fields received in a successful response to CONNECT. + "Successful" described as: 2xx (Successful). RFC 7231 4.3.6 */ + infof(data, "Ignoring Transfer-Encoding in " + "CONNECT %03d response\n", k->httpcode); + } + else if(Curl_compareheader(line_start, + "Transfer-Encoding:", "chunked")) { + infof(data, "CONNECT responded chunked\n"); + chunked_encoding = TRUE; + /* init our chunky engine */ + Curl_httpchunk_init(conn); } - infof(data, "CONNECT responded chunked\n"); - chunked_encoding = TRUE; - /* init our chunky engine */ - Curl_httpchunk_init(conn); } else if(Curl_compareheader(line_start, "Proxy-Connection:", "close")) closeConnection = TRUE; diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index c51cc3595..a115ab69d 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -131,7 +131,7 @@ test1244 test1245 test1246 test1247 test1248 test1249 test1250 test1251 \ test1252 test1253 test1254 test1255 test1256 test1257 test1258 test1259 \ test1260 \ \ -test1280 test1281 test1282 test1283 test1284 test1285 test1286 \ +test1280 test1281 test1282 test1283 test1284 test1285 test1286 test1287 \ \ test1300 test1301 test1302 test1303 test1304 test1305 test1306 test1307 \ test1308 test1309 test1310 test1311 test1312 test1313 test1314 test1315 \ diff --git a/tests/data/test1287 b/tests/data/test1287 new file mode 100644 index 000000000..83a2cd040 --- /dev/null +++ b/tests/data/test1287 @@ -0,0 +1,90 @@ + + + +HTTP +HTTP GET +HTTP CONNECT +proxytunnel + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Funny-head: yesyes +Content-Length: 9 + +contents + + +# The purpose of this test is to make sure curl ignores headers +# Content-Length and Transfer-Encoding in a successful CONNECT 2xx reply. + +HTTP/1.1 200 Mighty fine indeed +Content-Length: 123 +Transfer-Encoding: chunked + + + + +HTTP/1.1 200 Mighty fine indeed +Content-Length: 123 +Transfer-Encoding: chunked + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Server: test-server/fake swsclose +Content-Type: text/html +Funny-head: yesyes +Content-Length: 9 + +contents + + + +# +# Client-side + + +http +http-proxy + + +HTTP over proxy-tunnel ignore TE and CL in CONNECT 2xx responses + + +-v --proxytunnel -x %HOSTIP:%PROXYPORT http://test.1287:%HTTPPORT/we/want/that/page/1287 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +CONNECT test.1287:%HTTPPORT HTTP/1.1 +Host: test.1287:%HTTPPORT +Proxy-Connection: Keep-Alive + + + +GET /we/want/that/page/1287 HTTP/1.1 +Host: test.1287:%HTTPPORT +Accept: */* + + + +* Ignoring Content-Length in CONNECT 200 response +* Ignoring Transfer-Encoding in CONNECT 200 response + + +s/^.*(?=\* Ignoring (?:Content-Length|Transfer-Encoding) )// or $_ = '' + + +