diff --git a/Lib/httplib.py b/Lib/httplib.py index 8dbe8a07e41..dca9eca7774 100644 --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -530,7 +530,8 @@ def read(self, amt=None): s = self.fp.read(amt) if self.length is not None: self.length -= len(s) - + if not self.length: + self.close() return s def _read_chunked(self, amt): diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py index 36d6f7d7533..6a20c6b81d2 100644 --- a/Lib/test/test_httplib.py +++ b/Lib/test/test_httplib.py @@ -81,13 +81,25 @@ def test_status_lines(self): resp = httplib.HTTPResponse(sock) resp.begin() self.assertEqual(resp.read(), 'Text') - resp.close() + self.assertTrue(resp.isclosed()) body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText" sock = FakeSocket(body) resp = httplib.HTTPResponse(sock) self.assertRaises(httplib.BadStatusLine, resp.begin) + def test_partial_reads(self): + # if we have a lenght, the system knows when to close itself + # 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" + sock = FakeSocket(body) + resp = httplib.HTTPResponse(sock) + resp.begin() + self.assertEqual(resp.read(2), 'Te') + self.assertFalse(resp.isclosed()) + self.assertEqual(resp.read(2), 'xt') + self.assertTrue(resp.isclosed()) + def test_host_port(self): # Check invalid host_port @@ -133,7 +145,6 @@ def test_read_head(self): resp.begin() if resp.read() != "": self.fail("Did not expect response from HEAD request") - resp.close() def test_send_file(self): expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \