diff options
| author | Aymeric Augustin <aymeric.augustin@m4x.org> | 2012-12-24 20:25:02 +0100 |
|---|---|---|
| committer | Aymeric Augustin <aymeric.augustin@m4x.org> | 2012-12-24 20:30:20 +0100 |
| commit | cd914175c8209c5f366e87d94f8f6d050347757d (patch) | |
| tree | 3a2c7a1b1d8e3df4a82f8fc38cf26a74ce941df0 | |
| parent | ef98ae2910a6b5c86e1e0b003110455778e63324 (diff) | |
[1.5.x] Prevented caching of streaming responses.
The test introduced in 4b278131 accidentally passed because of a
limitation of Python < 3.3.
Refs #17758, #7581.
Backport of 1c8be95 from master.
| -rw-r--r-- | django/middleware/cache.py | 2 | ||||
| -rw-r--r-- | tests/regressiontests/cache/tests.py | 21 |
2 files changed, 10 insertions, 13 deletions
diff --git a/django/middleware/cache.py b/django/middleware/cache.py index 34bf0ca4a4..94c18eac1e 100644 --- a/django/middleware/cache.py +++ b/django/middleware/cache.py @@ -93,7 +93,7 @@ class UpdateCacheMiddleware(object): if not self._should_update_cache(request, response): # We don't need to update the cache, just return. return response - if not response.status_code == 200: + if response.streaming or response.status_code != 200: return response # Try to get the timeout from the "max-age" section of the "Cache- # Control" header before reverting to using the default cache_timeout diff --git a/tests/regressiontests/cache/tests.py b/tests/regressiontests/cache/tests.py index 9960c01300..cd7da4cece 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -1424,24 +1424,21 @@ class CacheI18nTest(TestCase): CACHE_MIDDLEWARE_SECONDS=60, USE_ETAGS=True, ) - def test_middleware_with_streaming_response(self): - # cache with non empty request.GET - request = self._get_request_cache(query_string='foo=baz&other=true') - - # first access, cache must return None + def test_middleware_doesnt_cache_streaming_response(self): + request = self._get_request() get_cache_data = FetchFromCacheMiddleware().process_request(request) - self.assertEqual(get_cache_data, None) + self.assertIsNone(get_cache_data) - # pass streaming response through UpdateCacheMiddleware. - content = 'Check for cache with QUERY_STRING and streaming content' + # This test passes on Python < 3.3 even without the corresponding code + # in UpdateCacheMiddleware, because pickling a StreamingHttpResponse + # fails (http://bugs.python.org/issue14288). LocMemCache silently + # swallows the exception and doesn't store the response in cache. + content = ['Check for cache with streaming content.'] response = StreamingHttpResponse(content) UpdateCacheMiddleware().process_response(request, response) - # second access, cache must still return None, because we can't cache - # streaming response. get_cache_data = FetchFromCacheMiddleware().process_request(request) - self.assertEqual(get_cache_data, None) - + self.assertIsNone(get_cache_data) @override_settings( CACHES={ |
