diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-06 08:37:19 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2013-02-06 08:37:19 (GMT) |
commit | daf990f8a79820e6e91ab5fa98a873e179d7602f (patch) | |
tree | 598d732e0a63a7678e239704fc51c6598f9f94a7 /Lib/http | |
parent | da23259f992a5f962fa9f95acb6608c2ecada348 (diff) | |
parent | b6c86fd87f93f73c8d5f759d3f5136f1a1cc67e9 (diff) | |
download | cpython-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.py | 38 |
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 |