summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Petrov <shazow@gmail.com>2015-04-27 12:57:48 -0400
committerAndrey Petrov <shazow@gmail.com>2015-04-27 12:57:48 -0400
commitd9aa58ca764e8a6fc2a452099e757ee0f96a2571 (patch)
tree32821899d36ffcb2f2442019035e6777b227b14c
parent548b79a1d1e81bfd297d2ebf1c0129859c656406 (diff)
parenta984fdfea70b4460b9ce4ca93b588a4a436ce3d8 (diff)
downloadurllib3-d9aa58ca764e8a6fc2a452099e757ee0f96a2571.tar.gz
Merge pull request #599 from t-8ch/chunked_keepalive
Fix Chunked keepalives.
-rw-r--r--dummyserver/handlers.py21
-rw-r--r--test/with_dummyserver/test_connectionpool.py19
-rw-r--r--urllib3/response.py2
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()