Skip to content

Commit

Permalink
Preserve chunked parameter on broken connections and redirects (urlli…
Browse files Browse the repository at this point in the history
  • Loading branch information
pquentin authored and sethmlarson committed Nov 7, 2019
1 parent 1d7798d commit 83b5d6d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/urllib3/connectionpool.py
Expand Up @@ -755,6 +755,7 @@ def urlopen(
timeout=timeout,
pool_timeout=pool_timeout,
release_conn=release_conn,
chunked=chunked,
body_pos=body_pos,
**response_kw
)
Expand Down Expand Up @@ -806,6 +807,7 @@ def drain_and_release_conn(response):
timeout=timeout,
pool_timeout=pool_timeout,
release_conn=release_conn,
chunked=chunked,
body_pos=body_pos,
**response_kw
)
Expand Down
52 changes: 52 additions & 0 deletions test/with_dummyserver/test_chunked_transfer.py
Expand Up @@ -122,3 +122,55 @@ def socket_handler(listener):
"GET", "/", chunked=True, preload_content=False, retries=retries
)
assert self.chunked_requests == 2

def test_preserve_chunked_on_redirect(self):
self.chunked_requests = 0

def socket_handler(listener):
for i in range(2):
sock = listener.accept()[0]
request = consume_socket(sock)
if b"Transfer-Encoding: chunked" in request.split(b"\r\n"):
self.chunked_requests += 1

if i == 0:
sock.send(
b"HTTP/1.1 301 Moved Permanently\r\n"
b"Location: /redirect\r\n\r\n"
)
else:
sock.send(b"HTTP/1.1 200 OK\r\n\r\n")
sock.close()

self._start_server(socket_handler)
with HTTPConnectionPool(self.host, self.port) as pool:
retries = Retry(redirect=1)
pool.urlopen(
"GET", "/", chunked=True, preload_content=False, retries=retries
)
assert self.chunked_requests == 2

def test_preserve_chunked_on_broken_connection(self):
self.chunked_requests = 0

def socket_handler(listener):
for i in range(2):
sock = listener.accept()[0]
request = consume_socket(sock)
if b"Transfer-Encoding: chunked" in request.split(b"\r\n"):
self.chunked_requests += 1

if i == 0:
# Bad HTTP version will trigger a connection close
sock.send(b"HTTP/0.5 200 OK\r\n\r\n")
else:
sock.send(b"HTTP/1.1 200 OK\r\n\r\n")
sock.close()

self._start_server(socket_handler)
with HTTPConnectionPool(self.host, self.port) as pool:
retries = Retry(read=1)
pool.urlopen(
"GET", "/", chunked=True, preload_content=False, retries=retries
)
assert self.chunked_requests == 2

0 comments on commit 83b5d6d

Please sign in to comment.