mirror of https://github.com/django/django.git
Removed `vary_delim_re` in `django/utils/cache.py` in favor of existing `cc_delim_re` since the latter is more correct in parsing the header (allows whitespace before and after comma separators instead of just after). As a bonus, tests added for `patch_vary_headers()`.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6696 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7d8ac66026
commit
34cc21983c
|
@ -70,8 +70,6 @@ def patch_cache_control(response, **kwargs):
|
||||||
cc = ', '.join([dictvalue(el) for el in cc.items()])
|
cc = ', '.join([dictvalue(el) for el in cc.items()])
|
||||||
response['Cache-Control'] = cc
|
response['Cache-Control'] = cc
|
||||||
|
|
||||||
vary_delim_re = re.compile(r',\s*')
|
|
||||||
|
|
||||||
def patch_response_headers(response, cache_timeout=None):
|
def patch_response_headers(response, cache_timeout=None):
|
||||||
"""
|
"""
|
||||||
Adds some useful headers to the given HttpResponse object:
|
Adds some useful headers to the given HttpResponse object:
|
||||||
|
@ -111,7 +109,7 @@ def patch_vary_headers(response, newheaders):
|
||||||
# computing an MD5 hash.
|
# computing an MD5 hash.
|
||||||
vary = []
|
vary = []
|
||||||
if response.has_header('Vary'):
|
if response.has_header('Vary'):
|
||||||
vary = vary_delim_re.split(response['Vary'])
|
vary = cc_delim_re.split(response['Vary'])
|
||||||
oldheaders = dict([(el.lower(), 1) for el in vary])
|
oldheaders = dict([(el.lower(), 1) for el in vary])
|
||||||
for newheader in newheaders:
|
for newheader in newheaders:
|
||||||
if not newheader.lower() in oldheaders:
|
if not newheader.lower() in oldheaders:
|
||||||
|
@ -169,7 +167,7 @@ def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
|
||||||
key_prefix, iri_to_uri(request.path))
|
key_prefix, iri_to_uri(request.path))
|
||||||
if response.has_header('Vary'):
|
if response.has_header('Vary'):
|
||||||
headerlist = ['HTTP_'+header.upper().replace('-', '_')
|
headerlist = ['HTTP_'+header.upper().replace('-', '_')
|
||||||
for header in vary_delim_re.split(response['Vary'])]
|
for header in cc_delim_re.split(response['Vary'])]
|
||||||
cache.set(cache_key, headerlist, cache_timeout)
|
cache.set(cache_key, headerlist, cache_timeout)
|
||||||
return _generate_cache_key(request, headerlist, key_prefix)
|
return _generate_cache_key(request, headerlist, key_prefix)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -3,9 +3,12 @@
|
||||||
# Unit tests for cache framework
|
# Unit tests for cache framework
|
||||||
# Uses whatever cache backend is set in the test settings file.
|
# Uses whatever cache backend is set in the test settings file.
|
||||||
|
|
||||||
from django.core.cache import cache
|
|
||||||
import time, unittest
|
import time, unittest
|
||||||
|
|
||||||
|
from django.core.cache import cache
|
||||||
|
from django.utils.cache import patch_vary_headers
|
||||||
|
from django.http import HttpResponse
|
||||||
|
|
||||||
# functions/classes for complex data type tests
|
# functions/classes for complex data type tests
|
||||||
def f():
|
def f():
|
||||||
return 42
|
return 42
|
||||||
|
@ -87,5 +90,30 @@ class Cache(unittest.TestCase):
|
||||||
cache.set(key, value)
|
cache.set(key, value)
|
||||||
self.assertEqual(cache.get(key), value)
|
self.assertEqual(cache.get(key), value)
|
||||||
|
|
||||||
|
|
||||||
|
class CacheUtils(unittest.TestCase):
|
||||||
|
"""TestCase for django.utils.cache functions."""
|
||||||
|
|
||||||
|
def test_patch_vary_headers(self):
|
||||||
|
headers = (
|
||||||
|
# Initial vary, new headers, resulting vary.
|
||||||
|
(None, ('Accept-Encoding',), 'Accept-Encoding'),
|
||||||
|
('Accept-Encoding', ('accept-encoding',), 'Accept-Encoding'),
|
||||||
|
('Accept-Encoding', ('ACCEPT-ENCODING',), 'Accept-Encoding'),
|
||||||
|
('Cookie', ('Accept-Encoding',), 'Cookie, Accept-Encoding'),
|
||||||
|
('Cookie, Accept-Encoding', ('Accept-Encoding',), 'Cookie, Accept-Encoding'),
|
||||||
|
('Cookie, Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
|
||||||
|
(None, ('Accept-Encoding', 'COOKIE'), 'Accept-Encoding, COOKIE'),
|
||||||
|
('Cookie, Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
|
||||||
|
('Cookie , Accept-Encoding', ('Accept-Encoding', 'cookie'), 'Cookie, Accept-Encoding'),
|
||||||
|
)
|
||||||
|
for initial_vary, newheaders, resulting_vary in headers:
|
||||||
|
response = HttpResponse()
|
||||||
|
if initial_vary is not None:
|
||||||
|
response['Vary'] = initial_vary
|
||||||
|
patch_vary_headers(response, newheaders)
|
||||||
|
self.assertEqual(response['Vary'], resulting_vary)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue