From 7066590736bb61b5f67ade490aeee327af4bc6e2 Mon Sep 17 00:00:00 2001 From: Facundo Batista Date: Thu, 18 Oct 2007 03:16:03 +0000 Subject: [PATCH] Issue #1580738. When HTTPConnection reads the whole stream with read(), it closes itself. When the stream is read in several calls to read(n), it should behave in the same way if HTTPConnection knows where the end of the stream is (through self.length). Added a test case for this behaviour. --- Lib/httplib.py | 3 ++- Lib/test/test_httplib.py | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) 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' \