summaryrefslogtreecommitdiffstats
path: root/Lib/http
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2013-02-06 08:37:19 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2013-02-06 08:37:19 (GMT)
commitdaf990f8a79820e6e91ab5fa98a873e179d7602f (patch)
tree598d732e0a63a7678e239704fc51c6598f9f94a7 /Lib/http
parentda23259f992a5f962fa9f95acb6608c2ecada348 (diff)
parentb6c86fd87f93f73c8d5f759d3f5136f1a1cc67e9 (diff)
downloadcpython-daf990f8a79820e6e91ab5fa98a873e179d7602f.zip
cpython-daf990f8a79820e6e91ab5fa98a873e179d7602f.tar.gz
cpython-daf990f8a79820e6e91ab5fa98a873e179d7602f.tar.bz2
Issue #16723: httplib.HTTPResponse no longer marked closed when the connection
is automatically closed.
Diffstat (limited to 'Lib/http')
-rw-r--r--Lib/http/client.py38
1 files changed, 21 insertions, 17 deletions
diff --git a/Lib/http/client.py b/Lib/http/client.py
index ce6e581..ba7d6fc 100644
--- a/Lib/http/client.py
+++ b/Lib/http/client.py
@@ -332,7 +332,7 @@ class HTTPResponse(io.RawIOBase):
# 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 @@ class HTTPResponse(io.RawIOBase):
# 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 @@ class HTTPResponse(io.RawIOBase):
# 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 @@ class HTTPResponse(io.RawIOBase):
return b""
if self._method == "HEAD":
- self.close()
+ self._close_conn()
return b""
if amt is not None:
@@ -510,10 +514,10 @@ class HTTPResponse(io.RawIOBase):
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 @@ class HTTPResponse(io.RawIOBase):
return 0
if self._method == "HEAD":
- self.close()
+ self._close_conn()
return 0
if self.chunked:
@@ -539,11 +543,11 @@ class HTTPResponse(io.RawIOBase):
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 @@ class HTTPResponse(io.RawIOBase):
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 @@ class HTTPResponse(io.RawIOBase):
self._read_and_discard_trailer()
# we read everything; close the "file"
- self.close()
+ self._close_conn()
return b''.join(value)
@@ -638,7 +642,7 @@ class HTTPResponse(io.RawIOBase):
self._read_and_discard_trailer()
# we read everything; close the "file"
- self.close()
+ self._close_conn()
return total_bytes