diff --git a/requests/models.py b/requests/models.py index 09ea87d9..a51ee700 100644 --- a/requests/models.py +++ b/requests/models.py @@ -559,11 +559,13 @@ class Response(object): ) def generate(): - while 1: - chunk = self.raw.read(chunk_size) - if not chunk: - break - yield chunk + # self.raw can be None if we're in safe_mode and the request failed + if self.raw is not None: + while 1: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk self._content_consumed = True gen = generate() @@ -597,23 +599,24 @@ class Response(object): ) def generate(): - chunk = [] + if self.raw is not None: + chunk = [] - while 1: - c = self.raw.read(1) - if not c: - break + while 1: + c = self.raw.read(1) + if not c: + break - if c in newlines: + if c in newlines: + yield ''.join(chunk) + chunk = [] + else: + chunk.append(c) + + # Yield the remainder, in case the response + # did not terminate with a newline + if chunk: yield ''.join(chunk) - chunk = [] - else: - chunk.append(c) - - # Yield the remainder, in case the response - # did not terminate with a newline - if chunk: - yield ''.join(chunk) self._content_consumed = True diff --git a/test_requests.py b/test_requests.py index e547aa64..2543103f 100755 --- a/test_requests.py +++ b/test_requests.py @@ -619,6 +619,17 @@ class RequestsTestSuite(unittest.TestCase): lines = '\n'.join(r.iter_lines()) self.assertEqual(lines, quote) + def test_null_response(self): + + # Safe mode creates empty responses for failed requests. + + # Iterating on these responses should produce empty sequences + r = requests.get('http://_/', config=dict(safe_mode=True)) + self.assertEquals(list(r.iter_lines()), []) + + r = requests.get('http://_/', config=dict(safe_mode=True)) + self.assertEquals(list(r.iter_content()), []) + def test_timeout(self): # When not in safe mode, should raise Timeout exception