Skip to content

Commit

Permalink
Fixed #17861 -- Took care of special characters when creating the sta…
Browse files Browse the repository at this point in the history
…ticfiles storage cache keys. Many thanks to Preston Holmes.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17688 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jezdez committed Mar 12, 2012
1 parent ebc6fc9 commit 3a5f9cd
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
2 changes: 1 addition & 1 deletion django/contrib/staticfiles/storage.py
Expand Up @@ -95,7 +95,7 @@ def hashed_name(self, name, content=None):
return urlunsplit(unparsed_name)

def cache_key(self, name):
return u'staticfiles:cache:%s' % name
return u'staticfiles:%s' % hashlib.md5(smart_str(name)).hexdigest()

def url(self, name, force=False):
"""
Expand Down
16 changes: 16 additions & 0 deletions tests/regressiontests/staticfiles_tests/tests.py
Expand Up @@ -7,10 +7,12 @@
import shutil
import sys
import tempfile
import warnings
from StringIO import StringIO

from django.template import loader, Context
from django.conf import settings
from django.core.cache.backends.base import BaseCache, CacheKeyWarning
from django.core.exceptions import ImproperlyConfigured
from django.core.files.storage import default_storage
from django.core.management import call_command
Expand Down Expand Up @@ -498,6 +500,20 @@ def test_post_processing(self):
self.assertTrue(os.path.join('cached', 'css', 'window.css') in stats['post_processed'])
self.assertTrue(os.path.join('cached', 'css', 'img', 'window.png') in stats['unmodified'])

def test_cache_key_memcache_validation(self):
"""
Handle cache key creation correctly, see #17861.
"""
name = "/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/long filename/ with spaces Here and ?#%#$/other/stuff/some crazy/" + chr(22) + chr(180)
cache_key = storage.staticfiles_storage.cache_key(name)
self.save_warnings_state()
cache_validator = BaseCache({})
warnings.filterwarnings('error', category=CacheKeyWarning)
cache_validator.validate_key(cache_key)
self.restore_warnings_state()
self.assertEqual(cache_key, 'staticfiles:e95bbc36387084582df2a70750d7b351')


# we set DEBUG to False here since the template tag wouldn't work otherwise
TestCollectionCachedStorage = override_settings(**dict(TEST_SETTINGS,
STATICFILES_STORAGE='django.contrib.staticfiles.storage.CachedStaticFilesStorage',
Expand Down

0 comments on commit 3a5f9cd

Please sign in to comment.