diff options
author | Nate Prewitt <Nate.Prewitt@gmail.com> | 2016-09-12 14:50:21 -0600 |
---|---|---|
committer | Nate Prewitt <Nate.Prewitt@gmail.com> | 2016-09-12 14:50:31 -0600 |
commit | 4dd7633d2ea613849fad1f8395e6a9d08742e17c (patch) | |
tree | ae7f6f346f1771d13d56f3126401050a76f2a474 | |
parent | c74bd70c3a97e30f0560bee9b7fa1bfc767ebf0b (diff) | |
download | urllib3-4dd7633d2ea613849fad1f8395e6a9d08742e17c.tar.gz |
changing conditional order to prefer isclosed over closed
isclosed is inherited from httplib/http.client's HTTPResponse while
closed only occurs on io objects (Python 3). The file pointer
can be empty and closed will still evaluate to False when
isclosed is True.
-rw-r--r-- | test/test_response.py | 20 | ||||
-rw-r--r-- | urllib3/response.py | 4 |
2 files changed, 19 insertions, 5 deletions
diff --git a/test/test_response.py b/test/test_response.py index 5c66f69d..10aa410e 100644 --- a/test/test_response.py +++ b/test/test_response.py @@ -1,4 +1,5 @@ import unittest +import socket from io import BytesIO, BufferedReader @@ -8,7 +9,7 @@ from urllib3.exceptions import ( ) from urllib3.packages.six.moves import http_client as httplib from urllib3.util.retry import Retry - +from urllib3.util.response import is_fp_closed from base64 import b64decode @@ -159,8 +160,6 @@ class TestResponse(unittest.TestCase): self.assertTrue(resp.closed) def test_io(self): - import socket - fp = BytesIO(b'foo') resp = HTTPResponse(fp, preload_content=False) @@ -190,6 +189,21 @@ class TestResponse(unittest.TestCase): self.assertEqual(resp3.closed, True) self.assertRaises(IOError, resp3.fileno) + def test_io_closed_consistently(self): + hlr = httplib.HTTPResponse(socket.socket()) + hlr.fp = BytesIO(b'foo') + hlr.chunked = 0 + hlr.length = 3 + resp = HTTPResponse(hlr, preload_content=False) + + self.assertEqual(resp.closed, False) + self.assertEqual(resp._fp.isclosed(), False) + self.assertEqual(is_fp_closed(resp._fp), False) + resp.read() + self.assertEqual(resp.closed, True) + self.assertEqual(resp._fp.isclosed(), True) + self.assertEqual(is_fp_closed(resp._fp), True) + def test_io_bufferedreader(self): fp = BytesIO(b'foo') resp = HTTPResponse(fp, preload_content=False) diff --git a/urllib3/response.py b/urllib3/response.py index be2accda..42d33319 100644 --- a/urllib3/response.py +++ b/urllib3/response.py @@ -482,10 +482,10 @@ class HTTPResponse(io.IOBase): def closed(self): if self._fp is None: return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() elif hasattr(self._fp, 'closed'): return self._fp.closed - elif hasattr(self._fp, 'isclosed'): # Python 2 - return self._fp.isclosed() else: return True |