]> granicus.if.org Git - python/commitdiff
Issue #1580738. When HTTPConnection reads the whole stream with read(),
authorFacundo Batista <facundobatista@gmail.com>
Thu, 18 Oct 2007 03:16:03 +0000 (03:16 +0000)
committerFacundo Batista <facundobatista@gmail.com>
Thu, 18 Oct 2007 03:16:03 +0000 (03:16 +0000)
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
Lib/test/test_httplib.py

index 8dbe8a07e41ef89c827d47b7ed9c896aee59a0d2..dca9eca7774a9cd5787de1ab5c97ec9668c83d1a 100644 (file)
@@ -530,7 +530,8 @@ class HTTPResponse:
         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):
index 36d6f7d75339507106d920eef45978d04a1b82b9..6a20c6b81d2284e681b49c50a4074263c08368bc 100644 (file)
@@ -81,13 +81,25 @@ class BasicTest(TestCase):
         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 @@ class BasicTest(TestCase):
         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' \