Author: jacob
Date: 2009-04-01 13:20:53 -0500 (Wed, 01 Apr 2009)
New Revision: 10336

Modified:
   django/branches/releases/1.0.X/django/utils/cache.py
   django/branches/releases/1.0.X/tests/regressiontests/cache/tests.py
Log:
[1.0.X] Fixed #10016: the cache middleware no longer vomits when handed long 
URLs. Thanks, Matt Croydon. Backport of r10335 from trunk.

Modified: django/branches/releases/1.0.X/django/utils/cache.py
===================================================================
--- django/branches/releases/1.0.X/django/utils/cache.py        2009-04-01 
18:19:32 UTC (rev 10335)
+++ django/branches/releases/1.0.X/django/utils/cache.py        2009-04-01 
18:20:53 UTC (rev 10336)
@@ -29,6 +29,7 @@
 from django.utils.encoding import smart_str, iri_to_uri
 from django.utils.http import http_date
 from django.utils.hashcompat import md5_constructor
+from django.http import HttpRequest
 
 cc_delim_re = re.compile(r'\s*,\s*')
 
@@ -143,13 +144,14 @@
         value = request.META.get(header, None)
         if value is not None:
             ctx.update(value)
+    path = md5_constructor(iri_to_uri(request.path))
     return 'views.decorators.cache.cache_page.%s.%s.%s' % (
-               key_prefix, iri_to_uri(request.path), ctx.hexdigest())
+               key_prefix, path.hexdigest(), ctx.hexdigest())
 
 def _generate_cache_header_key(key_prefix, request):
     """Returns a cache key for the header cache."""
-    return 'views.decorators.cache.cache_header.%s.%s' % (
-        key_prefix, iri_to_uri(request.path))
+    path = md5_constructor(iri_to_uri(request.path))
+    return 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, 
path.hexdigest())
 
 def get_cache_key(request, key_prefix=None):
     """

Modified: django/branches/releases/1.0.X/tests/regressiontests/cache/tests.py
===================================================================
--- django/branches/releases/1.0.X/tests/regressiontests/cache/tests.py 
2009-04-01 18:19:32 UTC (rev 10335)
+++ django/branches/releases/1.0.X/tests/regressiontests/cache/tests.py 
2009-04-01 18:20:53 UTC (rev 10336)
@@ -13,8 +13,8 @@
 from django.core import management
 from django.core.cache import get_cache
 from django.core.cache.backends.base import InvalidCacheBackendError
-from django.http import HttpResponse
-from django.utils.cache import patch_vary_headers
+from django.http import HttpResponse, HttpRequest
+from django.utils.cache import patch_vary_headers, get_cache_key, 
learn_cache_key
 from django.utils.hashcompat import md5_constructor
 
 # functions/classes for complex data type tests
@@ -264,6 +264,26 @@
 class CacheUtils(unittest.TestCase):
     """TestCase for django.utils.cache functions."""
 
+    def setUp(self):
+        self.path = '/cache/test/'
+        self.old_settings_key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+        self.old_middleware_seconds = settings.CACHE_MIDDLEWARE_SECONDS
+        settings.CACHE_MIDDLEWARE_KEY_PREFIX = 'settingsprefix'
+        settings.CACHE_MIDDLEWARE_SECONDS = 1
+
+    def tearDown(self):
+        settings.CACHE_MIDDLEWARE_KEY_PREFIX = self.old_settings_key_prefix
+        settings.CACHE_MIDDLEWARE_SECONDS = self.old_middleware_seconds
+
+    def _get_request(self, path):
+        request = HttpRequest()
+        request.META = {
+            'SERVER_NAME': 'testserver',
+            'SERVER_PORT': 80,
+        }
+        request.path = request.path_info = "/cache/%s" % path
+        return request
+
     def test_patch_vary_headers(self):
         headers = (
             # Initial vary, new headers, resulting vary.
@@ -284,6 +304,26 @@
             patch_vary_headers(response, newheaders)
             self.assertEqual(response['Vary'], resulting_vary)
 
+    def test_get_cache_key(self):
+        request = self._get_request(self.path)
+        response = HttpResponse()
+        key_prefix = 'localprefix'
+        # Expect None if no headers have been set yet.
+        self.assertEqual(get_cache_key(request), None)
+        # Set headers to an empty list.
+        learn_cache_key(request, response)
+        self.assertEqual(get_cache_key(request), 
'views.decorators.cache.cache_page.settingsprefix.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e')
+        # Verify that a specified key_prefix is taken in to account.
+        learn_cache_key(request, response, key_prefix=key_prefix)
+        self.assertEqual(get_cache_key(request, key_prefix=key_prefix), 
'views.decorators.cache.cache_page.localprefix.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e')
 
+    def test_learn_cache_key(self):
+        request = self._get_request(self.path)
+        response = HttpResponse()
+        response['Vary'] = 'Pony'
+        # Make sure that the Vary header is added to the key hash
+        learn_cache_key(request, response)
+        self.assertEqual(get_cache_key(request), 
'views.decorators.cache.cache_page.settingsprefix.a8c87a3d8c44853d7f79474f7ffe4ad5.d41d8cd98f00b204e9800998ecf8427e')
+
 if __name__ == '__main__':
     unittest.main()


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-updates@googlegroups.com
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to