Issue #16298: In HTTPResponse.read(), close the socket when there is no Content-Length and the incoming stream is finished.

Patch by Eran Rundstein.
This commit is contained in:
Antoine Pitrou 2012-12-15 19:11:54 +01:00
parent e0035a212b
commit 084daa2f74
4 changed files with 23 additions and 1 deletions

View File

@ -511,6 +511,10 @@ class HTTPResponse(io.RawIOBase):
self.length -= len(s) self.length -= len(s)
if not self.length: if not self.length:
self.close() self.close()
else:
if not s:
self.close()
return s return s
def _read_chunked(self, amt): def _read_chunked(self, amt):

View File

@ -175,7 +175,7 @@ class BasicTest(TestCase):
self.assertEqual(repr(exc), '''BadStatusLine("\'\'",)''') self.assertEqual(repr(exc), '''BadStatusLine("\'\'",)''')
def test_partial_reads(self): def test_partial_reads(self):
# if we have a lenght, the system knows when to close itself # if we have a length, the system knows when to close itself
# same behaviour than when we read the whole thing with read() # same behaviour than when we read the whole thing with read()
body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText" body = "HTTP/1.1 200 Ok\r\nContent-Length: 4\r\n\r\nText"
sock = FakeSocket(body) sock = FakeSocket(body)
@ -186,6 +186,19 @@ class BasicTest(TestCase):
self.assertEqual(resp.read(2), b'xt') self.assertEqual(resp.read(2), b'xt')
self.assertTrue(resp.isclosed()) self.assertTrue(resp.isclosed())
def test_partial_reads_no_content_length(self):
# when no length is present, the socket should be gracefully closed when
# all data was read
body = "HTTP/1.1 200 Ok\r\n\r\nText"
sock = FakeSocket(body)
resp = client.HTTPResponse(sock)
resp.begin()
self.assertEqual(resp.read(2), b'Te')
self.assertFalse(resp.isclosed())
self.assertEqual(resp.read(2), b'xt')
self.assertEqual(resp.read(1), b'')
self.assertTrue(resp.isclosed())
def test_host_port(self): def test_host_port(self):
# Check invalid host_port # Check invalid host_port

View File

@ -917,6 +917,7 @@ Paul Rubin
Sam Ruby Sam Ruby
Demur Rumed Demur Rumed
Audun S. Runde Audun S. Runde
Eran Rundstein
Rauli Ruohonen Rauli Ruohonen
Jeff Rush Jeff Rush
Sam Rushing Sam Rushing

View File

@ -179,6 +179,10 @@ Core and Builtins
Library Library
------- -------
- Issue #16298: In HTTPResponse.read(), close the socket when there is no
Content-Length and the incoming stream is finished. Patch by Eran
Rundstein.
- Issue #16248: Disable code execution from the user's home directory by - Issue #16248: Disable code execution from the user's home directory by
tkinter when the -E flag is passed to Python. Patch by Zachary Ware. tkinter when the -E flag is passed to Python. Patch by Zachary Ware.