Skip to content

Commit 4ab2550

Browse files
committed
Add test for default chunked Host header
1 parent 6fbfca9 commit 4ab2550

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

requests/adapters.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -458,10 +458,11 @@ def send(self, request, stream=False, timeout=None, verify=True, cert=None, prox
458458
low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT)
459459

460460
try:
461+
skip_host = 'Host' in request.headers
461462
low_conn.putrequest(request.method,
462463
url,
463464
skip_accept_encoding=True,
464-
skip_host='Host' in request.headers)
465+
skip_host=skip_host)
465466

466467
for header, value in request.headers.items():
467468
low_conn.putheader(header, value)

tests/test_lowlevel.py

+34-13
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@
99
from .utils import override_environ
1010

1111

12+
def echo_response_handler(sock):
13+
"""Simple handler that will take request and echo it back to requester."""
14+
request_content = consume_socket_content(sock, timeout=0.5)
15+
16+
text_200 = (
17+
b'HTTP/1.1 200 OK\r\n'
18+
b'Content-Length: %d\r\n\r\n'
19+
b'%s'
20+
) % (len(request_content), request_content)
21+
sock.send(text_200)
22+
23+
1224
def test_chunked_upload():
1325
"""can safely send generators"""
1426
close_server = threading.Event()
@@ -48,29 +60,38 @@ def incomplete_chunked_response_handler(sock):
4860

4961
def test_chunked_upload_uses_only_specified_host_header():
5062
"""Ensure we use only the specified Host header for chunked requests."""
51-
text_200 = (b'HTTP/1.1 200 OK\r\n'
52-
b'Content-Length: 0\r\n\r\n')
53-
wanted_host = 'sample-host'
54-
expected_header = 'Host: {}'.format(wanted_host).encode('utf-8')
55-
def single_host_resp_handler(sock):
56-
request_content = consume_socket_content(sock, timeout=0.5)
57-
assert expected_header in request_content
58-
assert request_content.count(b'Host: ') == 1
59-
sock.send(text_200)
63+
close_server = threading.Event()
64+
server = Server(echo_response_handler, wait_to_close_event=close_server)
6065

61-
return request_content
66+
data = iter([b'a', b'b', b'c'])
67+
custom_host = 'sample-host'
68+
69+
with server as (host, port):
70+
url = 'http://{}:{}/'.format(host, port)
71+
r = requests.post(url, data=data, headers={'Host': custom_host}, stream=True)
72+
close_server.set() # release server block
6273

74+
expected_header = b'Host: %s\r\n' % custom_host.encode('utf-8')
75+
assert expected_header in r.content
76+
assert r.content.count(b'Host: ') == 1
77+
78+
79+
def test_chunked_upload_doesnt_skip_host_header():
80+
"""Ensure we don't omit all Host headers with chunked requests."""
6381
close_server = threading.Event()
82+
server = Server(echo_response_handler, wait_to_close_event=close_server)
6483

65-
server = Server(single_host_resp_handler, wait_to_close_event=close_server)
6684
data = iter([b'a', b'b', b'c'])
6785

6886
with server as (host, port):
87+
expected_host = '{}:{}'.format(host, port)
6988
url = 'http://{}:{}/'.format(host, port)
70-
r = requests.post(url, data=data, headers={'Host': wanted_host}, stream=True)
89+
r = requests.post(url, data=data, stream=True)
7190
close_server.set() # release server block
7291

73-
assert r.status_code == 200
92+
expected_header = b'Host: %s\r\n' % expected_host.encode('utf-8')
93+
assert expected_header in r.content
94+
assert r.content.count(b'Host: ') == 1
7495

7596

7697
def test_conflicting_content_lengths():

0 commit comments

Comments
 (0)