From 1c8be95a864540d416602577d1aa03d58ba33168 Mon Sep 17 00:00:00 2001 From: Aymeric Augustin Date: Mon, 24 Dec 2012 20:25:02 +0100 Subject: [PATCH] Prevented caching of streaming responses. The test introduced in 4b278131 accidentally passed because of a limitation of Python < 3.3. Refs #17758, #7581. --- django/middleware/cache.py | 2 +- 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 de2b86f630..83860e15f3 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 fc92ecf870..4d6dc8fcd0 100644 --- a/tests/regressiontests/cache/tests.py +++ b/tests/regressiontests/cache/tests.py @@ -1428,24 +1428,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={