Issue #16723: httplib.HTTPResponse no longer marked closed when the connection
is automatically closed.
diff --git a/Lib/http/client.py b/Lib/http/client.py
index 62d9cff..4663d43 100644
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -332,7 +332,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
@@ -454,22 +454,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
@@ -477,6 +480,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.
@@ -490,7 +494,7 @@
             return b""
 
         if self._method == "HEAD":
-            self.close()
+            self._close_conn()
             return b""
 
         if amt is not None:
@@ -510,10 +514,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
 
     def readinto(self, b):
@@ -521,7 +525,7 @@
             return 0
 
         if self._method == "HEAD":
-            self.close()
+            self._close_conn()
             return 0
 
         if self.chunked:
@@ -539,11 +543,11 @@
         if not n:
             # 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 -= n
             if not self.length:
-                self.close()
+                self._close_conn()
         return n
 
     def _read_next_chunk_size(self):
@@ -559,7 +563,7 @@
         except ValueError:
             # close the connection as protocol synchronisation is
             # probably lost
-            self.close()
+            self._close_conn()
             raise
 
     def _read_and_discard_trailer(self):
@@ -597,7 +601,7 @@
         self._read_and_discard_trailer()
 
         # we read everything; close the "file"
-        self.close()
+        self._close_conn()
 
         return b''.join(value)
 
@@ -638,7 +642,7 @@
         self._read_and_discard_trailer()
 
         # we read everything; close the "file"
-        self.close()
+        self._close_conn()
 
         return total_bytes