Skip to content

Commit

Permalink
add method get_proxy_response_headers
Browse files Browse the repository at this point in the history
  • Loading branch information
nametkin committed May 6, 2023
1 parent de7f694 commit 5cc3ca9
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
22 changes: 14 additions & 8 deletions Lib/http/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,8 +221,8 @@ def _read_headers(fp):
break
return headers

def parse_headers(fp, _class=HTTPMessage):
"""Parses only RFC2822 headers from a file pointer.
def _parse_header_lines(header_lines, _class=HTTPMessage):
"""Parses only RFC2822 headers from header lines.
email Parser wants to see strings rather than bytes.
But a TextIOWrapper around self.rfile would buffer too many bytes
Expand All @@ -231,10 +231,13 @@ def parse_headers(fp, _class=HTTPMessage):
to parse.
"""
headers = _read_headers(fp)
hstring = b''.join(headers).decode('iso-8859-1')
hstring = b''.join(header_lines).decode('iso-8859-1')
return email.parser.Parser(_class=_class).parsestr(hstring)

def parse_headers(fp, _class=HTTPMessage):
headers = _read_headers(fp)
return _parse_header_lines(headers, _class)


class HTTPResponse(io.BufferedIOBase):

Expand Down Expand Up @@ -858,7 +861,7 @@ def __init__(self, host, port=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
self._tunnel_host = None
self._tunnel_port = None
self._tunnel_headers = {}
self._proxy_response_headers = None
self._raw_proxy_headers = None

(self.host, self.port) = self._get_hostport(host, port)

Expand Down Expand Up @@ -945,11 +948,11 @@ def _tunnel(self):
try:
(version, code, message) = response._read_status()

self._proxy_response_headers = parse_headers(response.fp)
self._raw_proxy_headers = _read_headers(response.fp)

if self.debuglevel > 0:
for hdr, val in self._proxy_response_headers.items():
print("header:", hdr + ":", val)
for header in self._raw_proxy_headers:
print('header:', header.decode())

if code != http.HTTPStatus.OK:
self.close()
Expand All @@ -958,6 +961,9 @@ def _tunnel(self):
finally:
response.close()

def get_proxy_response_headers(self):
return _parse_header_lines(self._raw_proxy_headers)

def connect(self):
"""Connect to the host and port specified in __init__."""
sys.audit("http.client.connect", self, self.host, self.port)
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_httplib.py
Original file line number Diff line number Diff line change
Expand Up @@ -2401,7 +2401,7 @@ def test_proxy_response_headers(self):
self.conn.set_tunnel('destination.com')

self.conn.request('PUT', '/', '')
headers = self.conn._proxy_response_headers
headers = self.conn.get_proxy_response_headers()
self.assertIn(expected_header, headers.items())

def test_tunnel_leak(self):
Expand Down

0 comments on commit 5cc3ca9

Please sign in to comment.