summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2012-10-22 22:52:36 +0200
committerAymeric Augustin <aymeric.augustin@m4x.org>2012-10-22 22:52:36 +0200
commit6a64822bf4632707212314a25a843c862bdb3874 (patch)
tree6955dd22ff43a490c3b0b84ec18d42df13c37d28
parente70170c2cbc8871f3bc1f585601b831eef0be9dc (diff)
Fixed #13222 -- Repeated iteration of HttpResponse
Thanks teepark for the report and grahamd for his insights.
-rw-r--r--django/http/response.py4
-rw-r--r--tests/regressiontests/httpwrappers/tests.py7
2 files changed, 9 insertions, 2 deletions
diff --git a/django/http/response.py b/django/http/response.py
index 4a5c479419..49145cd822 100644
--- a/django/http/response.py
+++ b/django/http/response.py
@@ -260,9 +260,9 @@ class HttpResponse(HttpResponseBase):
else:
self._container = [value]
self._base_content_is_iter = False
+ self._iterator = iter(self._container)
def __iter__(self):
- self._iterator = iter(self._container)
return self
def __next__(self):
@@ -284,7 +284,7 @@ class HttpResponse(HttpResponseBase):
def tell(self):
if self._base_content_is_iter:
raise Exception("This %s instance cannot tell its position" % self.__class__.__name__)
- return sum([len(chunk) for chunk in self])
+ return len(self.content)
class StreamingHttpResponse(HttpResponseBase):
diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py
index bfb4ae1fd5..803cbf029f 100644
--- a/tests/regressiontests/httpwrappers/tests.py
+++ b/tests/regressiontests/httpwrappers/tests.py
@@ -330,6 +330,13 @@ class HttpResponseTests(unittest.TestCase):
self.assertRaises(UnicodeEncodeError,
getattr, r, 'content')
+ def test_iterator_isnt_rewound(self):
+ # Regression test for #13222
+ r = HttpResponse('abc')
+ i = iter(r)
+ self.assertEqual(list(i), [b'abc'])
+ self.assertEqual(list(i), [])
+
def test_file_interface(self):
r = HttpResponse()
r.write(b"hello")