diff --git a/requests/models.py b/requests/models.py index e84c8f1a..88a002a0 100644 --- a/requests/models.py +++ b/requests/models.py @@ -597,7 +597,7 @@ class Response(object): def generate(): chunk = [] - while 1: + while True: c = self.raw.read(1) if not c: break @@ -608,6 +608,11 @@ class Response(object): 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 gen = generate() diff --git a/test_requests.py b/test_requests.py index 829d2a94..ebcb596d 100755 --- a/test_requests.py +++ b/test_requests.py @@ -3,6 +3,7 @@ from __future__ import with_statement +import StringIO import time import os import unittest @@ -603,5 +604,21 @@ class RequestsTestSuite(unittest.TestCase): self.assertEqual(i, len_lines) + # Test 'dangling' fragment in responses that do not terminate in + # a newline. + quote = ( + '''Why will he not upon our fair request\n''' + '''Untent his person and share the air with us?''' + ) + + # Make a request and monkey-patch its contents + r = requests.get(httpbin('get')) + r.raw = StringIO.StringIO(quote) + + # Make sure iter_lines doesn't chop the trailing bit + lines = '\n'.join(r.iter_lines()) + self.assertEqual(lines, quote) + + if __name__ == '__main__': unittest.main()