[Python-checkins] cpython (3.2): Issue #16723: httplib.HTTPResponse no longer marked closed when the connection

serhiy.storchaka python-checkins at python.org
Wed Feb 6 09:38:54 CET 2013


http://hg.python.org/cpython/rev/6cc5bbfcf04e
changeset:   82027:6cc5bbfcf04e
branch:      3.2
parent:      82021:801cb3918212
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Feb 06 10:31:57 2013 +0200
summary:
  Issue #16723: httplib.HTTPResponse no longer marked closed when the connection
is automatically closed.

files:
  Lib/http/client.py       |  34 +++++++++++++++------------
  Lib/test/test_httplib.py |  18 ++++++++++++++
  Misc/NEWS                |   2 +
  3 files changed, 39 insertions(+), 15 deletions(-)


diff --git a/Lib/http/client.py b/Lib/http/client.py
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -324,7 +324,7 @@
                 # empty version will cause next test to fail.
                 version = ""
         if not version.startswith("HTTP/"):
-            self.close()
+            self._close_conn()
             raise BadStatusLine(line)
 
         # The status code is a three-digit number
@@ -446,22 +446,25 @@
         # otherwise, assume it will close
         return True
 
+    def _close_conn(self):
+        fp = self.fp
+        self.fp = None
+        fp.close()
+
     def close(self):
+        super().close() # set "closed" flag
         if self.fp:
-            self.fp.close()
-            self.fp = None
+            self._close_conn()
 
     # These implementations are for the benefit of io.BufferedReader.
 
     # XXX This class should probably be revised to act more like
     # the "raw stream" that BufferedReader expects.
 
-    @property
-    def closed(self):
-        return self.isclosed()
-
     def flush(self):
-        self.fp.flush()
+        super().flush()
+        if self.fp:
+            self.fp.flush()
 
     def readable(self):
         return True
@@ -469,6 +472,7 @@
     # End of "raw stream" methods
 
     def isclosed(self):
+        """True if the connection is closed."""
         # NOTE: it is possible that we will not ever call self.close(). This
         #       case occurs when will_close is TRUE, length is None, and we
         #       read up to the last byte, but NOT past it.
@@ -482,7 +486,7 @@
             return b""
 
         if self._method == "HEAD":
-            self.close()
+            self._close_conn()
             return b""
 
         if self.chunked:
@@ -496,10 +500,10 @@
                 try:
                     s = self._safe_read(self.length)
                 except IncompleteRead:
-                    self.close()
+                    self._close_conn()
                     raise
                 self.length = 0
-            self.close()        # we read everything
+            self._close_conn()        # we read everything
             return s
 
         if self.length is not None:
@@ -514,11 +518,11 @@
         if not s:
             # Ideally, we would raise IncompleteRead if the content-length
             # wasn't satisfied, but it might break compatibility.
-            self.close()
+            self._close_conn()
         elif self.length is not None:
             self.length -= len(s)
             if not self.length:
-                self.close()
+                self._close_conn()
 
         return s
 
@@ -539,7 +543,7 @@
                 except ValueError:
                     # close the connection as protocol synchronisation is
                     # probably lost
-                    self.close()
+                    self._close_conn()
                     raise IncompleteRead(b''.join(value))
                 if chunk_left == 0:
                     break
@@ -576,7 +580,7 @@
                 break
 
         # we read everything; close the "file"
-        self.close()
+        self._close_conn()
 
         return b''.join(value)
 
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
--- a/Lib/test/test_httplib.py
+++ b/Lib/test/test_httplib.py
@@ -164,6 +164,9 @@
         resp.begin()
         self.assertEqual(resp.read(), b"Text")
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
         body = "HTTP/1.1 400.100 Not Ok\r\n\r\nText"
         sock = FakeSocket(body)
@@ -185,6 +188,9 @@
         self.assertFalse(resp.isclosed())
         self.assertEqual(resp.read(2), b'xt')
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
     def test_partial_reads_no_content_length(self):
         # when no length is present, the socket should be gracefully closed when
@@ -198,6 +204,9 @@
         self.assertEqual(resp.read(2), b'xt')
         self.assertEqual(resp.read(1), b'')
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
     def test_partial_reads_incomplete_body(self):
         # if the server shuts down the connection before the whole
@@ -211,6 +220,9 @@
         self.assertEqual(resp.read(2), b'xt')
         self.assertEqual(resp.read(1), b'')
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
     def test_host_port(self):
         # Check invalid host_port
@@ -355,6 +367,9 @@
         self.assertEqual(resp.status, 200)
         self.assertEqual(resp.reason, 'OK')
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
     def test_negative_content_length(self):
         sock = FakeSocket(
@@ -430,6 +445,9 @@
         resp.begin()
         self.assertEqual(resp.read(), b'')
         self.assertTrue(resp.isclosed())
+        self.assertFalse(resp.closed)
+        resp.close()
+        self.assertTrue(resp.closed)
 
 class OfflineTest(TestCase):
     def test_responses(self):
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -212,6 +212,8 @@
 Library
 -------
 
+- Issue #16723: httplib.HTTPResponse no longer marked closed when the connection
+  is automatically closed.
 
 - Issue #16948: Fix quoted printable body encoding for non-latin1 character
   sets in the email package.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list