summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/http/client.py18
-rw-r--r--Lib/test/test_httplib.py14
-rw-r--r--Misc/NEWS.d/next/Library/2021-05-16-14-28-30.bpo-24964.Oa5Ie_.rst3
3 files changed, 24 insertions, 11 deletions
diff --git a/Lib/http/client.py b/Lib/http/client.py
index 74f7bcb68f..50f2b46807 100644
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -858,6 +858,7 @@ class HTTPConnection:
self._tunnel_host = None
self._tunnel_port = None
self._tunnel_headers = {}
+ self._proxy_response_headers = None
(self.host, self.port) = self._get_hostport(host, port)
@@ -944,21 +945,16 @@ class HTTPConnection:
try:
(version, code, message) = response._read_status()
+ self._proxy_response_headers = parse_headers(response.fp)
+
+ if self.debuglevel > 0:
+ for hdr, val in self._proxy_response_headers.items():
+ print("header:", hdr + ":", val)
+
if code != http.HTTPStatus.OK:
self.close()
raise OSError(f"Tunnel connection failed: {code} {message.strip()}")
- while True:
- line = response.fp.readline(_MAXLINE + 1)
- if len(line) > _MAXLINE:
- raise LineTooLong("header line")
- if not line:
- # for sites which EOF without sending a trailer
- break
- if line in (b'\r\n', b'\n', b''):
- break
- if self.debuglevel > 0:
- print('header:', line.decode())
finally:
response.close()
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
index 37f77fe0a3..4b1d355f55 100644
--- a/Lib/test/test_httplib.py
+++ b/Lib/test/test_httplib.py
@@ -2390,6 +2390,20 @@ class TunnelTests(TestCase):
lines = output.getvalue().splitlines()
self.assertIn('header: {}'.format(expected_header), lines)
+ def test_proxy_response_headers(self):
+ expected_header = ('X-Dummy', '1')
+ response_text = (
+ 'HTTP/1.0 200 OK\r\n'
+ '{0}\r\n\r\n'.format(':'.join(expected_header))
+ )
+
+ self.conn._create_connection = self._create_connection(response_text)
+ self.conn.set_tunnel('destination.com')
+
+ self.conn.request('PUT', '/', '')
+ headers = self.conn._proxy_response_headers
+ self.assertIn(expected_header, headers.items())
+
def test_tunnel_leak(self):
sock = None
diff --git a/Misc/NEWS.d/next/Library/2021-05-16-14-28-30.bpo-24964.Oa5Ie_.rst b/Misc/NEWS.d/next/Library/2021-05-16-14-28-30.bpo-24964.Oa5Ie_.rst
new file mode 100644
index 0000000000..ba113673b7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-05-16-14-28-30.bpo-24964.Oa5Ie_.rst
@@ -0,0 +1,3 @@
+Added attribute '_proxy_response_headers' to HTTPConnection class. This
+attribute contains the headers of the proxy server response to the CONNECT
+request.