summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandrewnester <andrew.nester.dev@gmail.com>2016-06-20 22:46:33 +0300
committerTim Graham <timograham@gmail.com>2016-07-15 15:34:00 -0400
commit20d39325ca1da57a709f3ba38299dc7b0fc4bdfb (patch)
treea1c9329974ea172e62be756f7d0491575eeba643
parentba246bd5fe3c3c392cb0a56648542dbca435d107 (diff)
Fixed #26765 -- Made CommonMiddleware no longer set an ETag when response has Cache-Control: no-store.
-rw-r--r--django/middleware/common.py13
-rw-r--r--tests/middleware/tests.py14
2 files changed, 25 insertions, 2 deletions
diff --git a/django/middleware/common.py b/django/middleware/common.py
index b705f72b81..3d55baebde 100644
--- a/django/middleware/common.py
+++ b/django/middleware/common.py
@@ -5,7 +5,9 @@ from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.core.mail import mail_managers
from django.urls import is_valid_path
-from django.utils.cache import get_conditional_response, set_response_etag
+from django.utils.cache import (
+ cc_delim_re, get_conditional_response, set_response_etag,
+)
from django.utils.deprecation import MiddlewareMixin
from django.utils.encoding import force_text
from django.utils.http import unquote_etag
@@ -113,7 +115,7 @@ class CommonMiddleware(MiddlewareMixin):
if self.should_redirect_with_slash(request):
return self.response_redirect_class(self.get_full_path_with_slash(request))
- if settings.USE_ETAGS:
+ if settings.USE_ETAGS and self.needs_etag(response):
if not response.has_header('ETag'):
set_response_etag(response)
@@ -130,6 +132,13 @@ class CommonMiddleware(MiddlewareMixin):
return response
+ def needs_etag(self, response):
+ """
+ Return True if an ETag header should be added to response.
+ """
+ cache_control_headers = cc_delim_re.split(response.get('Cache-Control', ''))
+ return all(header.lower() != 'no-store' for header in cache_control_headers)
+
class BrokenLinkEmailsMiddleware(MiddlewareMixin):
diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py
index f9ef951b44..07e1d4ea5a 100644
--- a/tests/middleware/tests.py
+++ b/tests/middleware/tests.py
@@ -276,6 +276,20 @@ class CommonMiddlewareTest(SimpleTestCase):
self.assertFalse(CommonMiddleware().process_response(req, res).has_header('ETag'))
@override_settings(USE_ETAGS=True)
+ def test_no_etag_no_store_cache(self):
+ req = HttpRequest()
+ res = HttpResponse('content')
+ res['Cache-Control'] = 'No-Cache, No-Store, Max-age=0'
+ self.assertFalse(CommonMiddleware().process_response(req, res).has_header('ETag'))
+
+ @override_settings(USE_ETAGS=True)
+ def test_etag_extended_cache_control(self):
+ req = HttpRequest()
+ res = HttpResponse('content')
+ res['Cache-Control'] = 'my-directive="my-no-store"'
+ self.assertTrue(CommonMiddleware().process_response(req, res).has_header('ETag'))
+
+ @override_settings(USE_ETAGS=True)
def test_if_none_match(self):
first_req = HttpRequest()
first_res = CommonMiddleware().process_response(first_req, HttpResponse('content'))