mirror of
https://github.com/curl/curl.git
synced 2026-04-14 22:01:41 +03:00
proxy: chunked response, error code
Add test1715 to check proper handling of chunked transfer encoding in CONNECT responses. Change proxy error code from 56 (RECV_ERROR) for everything to 7 (COULDNT_CONNECT) when the server response could be read successfully, but establishing the connection is not possible (http status code wrong). Adapt several test expectations from 56 to 7. Closes #21084
This commit is contained in:
parent
39036c9021
commit
a186ecf4bf
15 changed files with 84 additions and 29 deletions
|
|
@ -465,17 +465,7 @@ static CURLcode recv_CONNECT_resp(struct Curl_cfilter *cf,
|
||||||
|
|
||||||
if(ts->keepon == KEEPON_IGNORE) {
|
if(ts->keepon == KEEPON_IGNORE) {
|
||||||
/* This means we are currently ignoring a response-body */
|
/* This means we are currently ignoring a response-body */
|
||||||
|
if(ts->chunked_encoding) {
|
||||||
if(ts->cl) {
|
|
||||||
/* A Content-Length based body: count down the counter
|
|
||||||
and make sure to break out of the loop when we are done! */
|
|
||||||
ts->cl--;
|
|
||||||
if(ts->cl <= 0) {
|
|
||||||
ts->keepon = KEEPON_DONE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(ts->chunked_encoding) {
|
|
||||||
/* chunked-encoded body, so we need to do the chunked dance
|
/* chunked-encoded body, so we need to do the chunked dance
|
||||||
properly to know when the end of the body is reached */
|
properly to know when the end of the body is reached */
|
||||||
size_t consumed = 0;
|
size_t consumed = 0;
|
||||||
|
|
@ -491,6 +481,15 @@ static CURLcode recv_CONNECT_resp(struct Curl_cfilter *cf,
|
||||||
ts->keepon = KEEPON_DONE;
|
ts->keepon = KEEPON_DONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(ts->cl) {
|
||||||
|
/* A Content-Length based body: count down the counter
|
||||||
|
and make sure to break out of the loop when we are done! */
|
||||||
|
ts->cl--;
|
||||||
|
if(ts->cl <= 0) {
|
||||||
|
ts->keepon = KEEPON_DONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -597,6 +596,8 @@ static CURLcode H1_CONNECT(struct Curl_cfilter *cf,
|
||||||
/* read what is there */
|
/* read what is there */
|
||||||
CURL_TRC_CF(data, cf, "CONNECT receive");
|
CURL_TRC_CF(data, cf, "CONNECT receive");
|
||||||
result = recv_CONNECT_resp(cf, data, ts, &done);
|
result = recv_CONNECT_resp(cf, data, ts, &done);
|
||||||
|
if(result)
|
||||||
|
CURL_TRC_CF(data, cf, "error receiving CONNECT response: %d", result);
|
||||||
if(!result)
|
if(!result)
|
||||||
result = Curl_pgrsUpdate(data);
|
result = Curl_pgrsUpdate(data);
|
||||||
/* error or not complete yet. return for more multi-multi */
|
/* error or not complete yet. return for more multi-multi */
|
||||||
|
|
@ -645,7 +646,7 @@ static CURLcode H1_CONNECT(struct Curl_cfilter *cf,
|
||||||
Curl_safefree(data->req.newurl);
|
Curl_safefree(data->req.newurl);
|
||||||
h1_tunnel_go_state(cf, ts, H1_TUNNEL_FAILED, data);
|
h1_tunnel_go_state(cf, ts, H1_TUNNEL_FAILED, data);
|
||||||
failf(data, "CONNECT tunnel failed, response %d", data->req.httpcode);
|
failf(data, "CONNECT tunnel failed, response %d", data->req.httpcode);
|
||||||
return CURLE_RECV_ERROR;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
/* 2xx response, SUCCESS! */
|
/* 2xx response, SUCCESS! */
|
||||||
h1_tunnel_go_state(cf, ts, H1_TUNNEL_ESTABLISHED, data);
|
h1_tunnel_go_state(cf, ts, H1_TUNNEL_ESTABLISHED, data);
|
||||||
|
|
|
||||||
|
|
@ -811,7 +811,7 @@ static CURLcode inspect_response(struct Curl_cfilter *cf,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Seems to have failed */
|
/* Seems to have failed */
|
||||||
return CURLE_RECV_ERROR;
|
return CURLE_COULDNT_CONNECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static CURLcode H2_CONNECT(struct Curl_cfilter *cf,
|
static CURLcode H2_CONNECT(struct Curl_cfilter *cf,
|
||||||
|
|
|
||||||
|
|
@ -229,7 +229,7 @@ test1670 test1671 test1672 test1673 \
|
||||||
test1680 test1681 test1682 test1683 test1684 \
|
test1680 test1681 test1682 test1683 test1684 \
|
||||||
\
|
\
|
||||||
test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 \
|
test1700 test1701 test1702 test1703 test1704 test1705 test1706 test1707 \
|
||||||
test1708 test1709 test1710 test1711 test1712 test1713 test1714 \
|
test1708 test1709 test1710 test1711 test1712 test1713 test1714 test1715 \
|
||||||
\
|
\
|
||||||
test1800 test1801 test1802 test1847 test1848 test1849 test1850 test1851 \
|
test1800 test1801 test1802 test1847 test1848 test1849 test1850 test1851 \
|
||||||
\
|
\
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ ftp://test-number:%TESTNUMBER/wanted/page -p -x %HOSTIP:%HTTPPORT
|
||||||
<verify>
|
<verify>
|
||||||
# The server does not implement CONNECT for ftp, so this must be a failure test
|
# The server does not implement CONNECT for ftp, so this must be a failure test
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<protocol crlf="headers">
|
<protocol crlf="headers">
|
||||||
CONNECT test-number:%TESTNUMBER HTTP/1.1
|
CONNECT test-number:%TESTNUMBER HTTP/1.1
|
||||||
|
|
|
||||||
54
tests/data/test1715
Normal file
54
tests/data/test1715
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
<?xml version="1.0" encoding="US-ASCII"?>
|
||||||
|
<testcase>
|
||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
HTTP
|
||||||
|
HTTP GET
|
||||||
|
HTTP CONNECT
|
||||||
|
HTTP proxy
|
||||||
|
proxytunnel
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
|
|
||||||
|
<reply>
|
||||||
|
|
||||||
|
<connect crlf="headers">
|
||||||
|
HTTP/1.1 407 Proxy Authentication Required
|
||||||
|
Proxy-Authenticate: Special realm="none", nonce="abc123"
|
||||||
|
Content-Length: 13
|
||||||
|
Transfer-Encoding: chunked
|
||||||
|
Magic-special: true
|
||||||
|
|
||||||
|
some content
|
||||||
|
</connect>
|
||||||
|
</reply>
|
||||||
|
|
||||||
|
<client>
|
||||||
|
<server>
|
||||||
|
http
|
||||||
|
</server>
|
||||||
|
<features>
|
||||||
|
proxy
|
||||||
|
</features>
|
||||||
|
<name>
|
||||||
|
HTTP CONNECT with proxy returning Content-Length and chunked
|
||||||
|
</name>
|
||||||
|
<command>
|
||||||
|
http://test.example --proxy http://%HOSTIP:%HTTPPORT --proxytunnel -sS
|
||||||
|
</command>
|
||||||
|
</client>
|
||||||
|
|
||||||
|
# Verify data after the test has been "shot"
|
||||||
|
<verify>
|
||||||
|
<protocol crlf="headers">
|
||||||
|
CONNECT test.example:80 HTTP/1.1
|
||||||
|
Host: test.example:80
|
||||||
|
User-Agent: curl/%VERSION
|
||||||
|
Proxy-Connection: Keep-Alive
|
||||||
|
|
||||||
|
</protocol>
|
||||||
|
<errorcode>
|
||||||
|
56
|
||||||
|
</errorcode>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
||||||
|
|
@ -49,9 +49,9 @@ User-Agent: curl/%VERSION
|
||||||
Proxy-Connection: Keep-Alive
|
Proxy-Connection: Keep-Alive
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
# CURLE_RECV_ERROR
|
# CURLE_COULDNT_CONNECT
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<stdout crlf="headers">
|
<stdout crlf="headers">
|
||||||
HTTP/1.1 405 Method Not Allowed swsclose
|
HTTP/1.1 405 Method Not Allowed swsclose
|
||||||
|
|
|
||||||
|
|
@ -45,9 +45,9 @@ Proxy-Connection: Keep-Alive
|
||||||
User-Agent: looser/2007
|
User-Agent: looser/2007
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
# CURLE_RECV_ERROR
|
# CURLE_COULDNT_CONNECT
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<stdout crlf="headers">
|
<stdout crlf="headers">
|
||||||
HTTP/1.1 405 Method Not Allowed swsclose
|
HTTP/1.1 405 Method Not Allowed swsclose
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ HTTPS GET over HTTP proxy fails
|
||||||
# Verify data after the test has been "shot"
|
# Verify data after the test has been "shot"
|
||||||
<verify>
|
<verify>
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<data>
|
<data>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
||||||
|
|
@ -72,7 +72,7 @@ https://this.hsts.example./%TESTNUMBER
|
||||||
</stdout>
|
</stdout>
|
||||||
# Proxy CONNECT aborted
|
# Proxy CONNECT aborted
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<limits>
|
<limits>
|
||||||
Allocations: 160
|
Allocations: 160
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ https://this.hsts.example/%TESTNUMBER
|
||||||
</stdout>
|
</stdout>
|
||||||
# Proxy CONNECT aborted
|
# Proxy CONNECT aborted
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
</verify>
|
</verify>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
|
|
||||||
|
|
@ -70,7 +70,7 @@ https://this.hsts.example/%TESTNUMBER
|
||||||
</stdout>
|
</stdout>
|
||||||
# Proxy CONNECT aborted
|
# Proxy CONNECT aborted
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
</verify>
|
</verify>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ Proxy-Connection: Keep-Alive
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
</verify>
|
</verify>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
|
|
||||||
|
|
@ -53,10 +53,10 @@ Proxy-Connection: Keep-Alive
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<stderr mode="text">
|
<stderr mode="text">
|
||||||
curl: (56) CONNECT tunnel failed, response 400
|
curl: (7) CONNECT tunnel failed, response 400
|
||||||
</stderr>
|
</stderr>
|
||||||
</verify>
|
</verify>
|
||||||
</testcase>
|
</testcase>
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ https://test.anything.really.com:%TESTNUMBER --proxy1.0 %HOSTIP:%HTTPPORT
|
||||||
# Verify data after the test has been "shot"
|
# Verify data after the test has been "shot"
|
||||||
<verify>
|
<verify>
|
||||||
<errorcode>
|
<errorcode>
|
||||||
56
|
7
|
||||||
</errorcode>
|
</errorcode>
|
||||||
<protocol crlf="headers">
|
<protocol crlf="headers">
|
||||||
CONNECT test.anything.really.com:%TESTNUMBER HTTP/1.0
|
CONNECT test.anything.really.com:%TESTNUMBER HTTP/1.0
|
||||||
|
|
|
||||||
|
|
@ -104,7 +104,7 @@ class TestProxyAuth:
|
||||||
r = curl.http_download(urls=[url], alpn_proto='http/1.1', with_stats=True,
|
r = curl.http_download(urls=[url], alpn_proto='http/1.1', with_stats=True,
|
||||||
extra_args=xargs)
|
extra_args=xargs)
|
||||||
# expect "COULD_NOT_CONNECT"
|
# expect "COULD_NOT_CONNECT"
|
||||||
r.check_response(exitcode=56, http_status=None)
|
r.check_response(exitcode=7, http_status=None)
|
||||||
|
|
||||||
def test_13_06_tunnel_http_auth(self, env: Env, httpd, configures_httpd):
|
def test_13_06_tunnel_http_auth(self, env: Env, httpd, configures_httpd):
|
||||||
self.httpd_configure(env, httpd)
|
self.httpd_configure(env, httpd)
|
||||||
|
|
@ -133,7 +133,7 @@ class TestProxyAuth:
|
||||||
r = curl.http_download(urls=[url], alpn_proto=proto, with_stats=True,
|
r = curl.http_download(urls=[url], alpn_proto=proto, with_stats=True,
|
||||||
extra_args=xargs)
|
extra_args=xargs)
|
||||||
# expect "COULD_NOT_CONNECT"
|
# expect "COULD_NOT_CONNECT"
|
||||||
r.check_response(exitcode=56, http_status=None)
|
r.check_response(exitcode=7, http_status=None)
|
||||||
assert self.get_tunnel_proto_used(r) == tunnel
|
assert self.get_tunnel_proto_used(r) == tunnel
|
||||||
|
|
||||||
@pytest.mark.skipif(condition=not Env.have_nghttpx(), reason="no nghttpx available")
|
@pytest.mark.skipif(condition=not Env.have_nghttpx(), reason="no nghttpx available")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue