Commit 084daa2f authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #16298: In HTTPResponse.read(), close the socket when there is no...

Issue #16298: In HTTPResponse.read(), close the socket when there is no Content-Length and the incoming stream is finished.
Patch by Eran Rundstein.
parent e0035a21
...@@ -511,6 +511,10 @@ class HTTPResponse(io.RawIOBase): ...@@ -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):
......
...@@ -175,7 +175,7 @@ class BasicTest(TestCase): ...@@ -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): ...@@ -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
......
...@@ -917,6 +917,7 @@ Paul Rubin ...@@ -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
......
...@@ -179,6 +179,10 @@ Core and Builtins ...@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment