diff options
author | Andrey Petrov <shazow@gmail.com> | 2015-04-27 12:57:48 -0400 |
---|---|---|
committer | Andrey Petrov <shazow@gmail.com> | 2015-04-27 12:57:48 -0400 |
commit | d9aa58ca764e8a6fc2a452099e757ee0f96a2571 (patch) | |
tree | 32821899d36ffcb2f2442019035e6777b227b14c | |
parent | 548b79a1d1e81bfd297d2ebf1c0129859c656406 (diff) | |
parent | a984fdfea70b4460b9ce4ca93b588a4a436ce3d8 (diff) | |
download | urllib3-d9aa58ca764e8a6fc2a452099e757ee0f96a2571.tar.gz |
Merge pull request #599 from t-8ch/chunked_keepalive
Fix Chunked keepalives.
-rw-r--r-- | dummyserver/handlers.py | 21 | ||||
-rw-r--r-- | test/with_dummyserver/test_connectionpool.py | 19 | ||||
-rw-r--r-- | urllib3/response.py | 2 |
3 files changed, 38 insertions, 4 deletions
diff --git a/dummyserver/handlers.py b/dummyserver/handlers.py index 80e951ec..358f06e8 100644 --- a/dummyserver/handlers.py +++ b/dummyserver/handlers.py @@ -21,9 +21,6 @@ log = logging.getLogger(__name__) class Response(object): def __init__(self, body='', status='200 OK', headers=None): - if not isinstance(body, bytes): - body = body.encode('utf8') - self.body = body self.status = status self.headers = headers or [("Content-type", "text/plain")] @@ -34,7 +31,20 @@ class Response(object): for header,value in self.headers: request_handler.add_header(header,value) - request_handler.write(self.body) + # chunked + if isinstance(self.body, list): + for item in self.body: + if not isinstance(item, bytes): + item = item.encode('utf8') + request_handler.write(item) + request_handler.flush() + else: + body = self.body + if not isinstance(body, bytes): + body = body.encode('utf8') + + request_handler.write(body) + RETRY_TEST_NAMES = collections.defaultdict(int) @@ -208,6 +218,9 @@ class TestingApp(RequestHandler): else: return Response("need to keep retrying!", status="418 I'm A Teapot") + def chunked(self, request): + return Response(['123'] * 4) + def shutdown(self, request): sys.exit() diff --git a/test/with_dummyserver/test_connectionpool.py b/test/with_dummyserver/test_connectionpool.py index e76fcb7f..a867c50b 100644 --- a/test/with_dummyserver/test_connectionpool.py +++ b/test/with_dummyserver/test_connectionpool.py @@ -618,6 +618,25 @@ class TestConnectionPool(HTTPDummyServerTestCase): self.assertRaises(ProtocolError, pool.request, 'GET', '/source_address') + def test_stream_keepalive(self): + x = 2 + + for _ in range(x): + response = self.pool.request( + 'GET', + '/chunked', + headers={ + 'Connection': 'keep-alive', + }, + preload_content=False, + retries=False, + ) + for chunk in response.stream(): + self.assertEqual(chunk, b'123') + + self.assertEqual(self.pool.num_connections, 1) + self.assertEqual(self.pool.num_requests, x) + class TestRetry(HTTPDummyServerTestCase): def setUp(self): diff --git a/urllib3/response.py b/urllib3/response.py index 79a5e789..e0236e5d 100644 --- a/urllib3/response.py +++ b/urllib3/response.py @@ -455,4 +455,6 @@ class HTTPResponse(io.IOBase): break # We read everything; close the "file". + if self._original_response: + self._original_response.close() self.release_conn() |