Browse Source

Fixed #18487 -- Made sure that protocol-relative URLs aren't processed by the cached staticfiles storage. Thanks to LukaszBalcerzak for the patch.

Jannis Leidel 12 years ago
parent
commit
1aa0d8ac4d

+ 1 - 1
django/contrib/staticfiles/storage.py

@@ -161,7 +161,7 @@ class CachedFilesMixin(object):
             matched, url = matchobj.groups()
             # Completely ignore http(s) prefixed URLs,
             # fragments and data-uri URLs
-            if url.startswith(('#', 'http:', 'https:', 'data:')):
+            if url.startswith(('#', 'http:', 'https:', 'data:', '//')):
                 return matched
             name_parts = name.split(os.sep)
             # Using posix normpath here to remove duplicates

+ 8 - 0
tests/regressiontests/staticfiles_tests/project/documents/cached/css/ignored.css

@@ -0,0 +1,8 @@
+body {
+    background: url("#foobar");
+    background: url("http:foobar");
+    background: url("https:foobar");
+    background: url("data:foobar");
+    background: url("//foobar");
+}
+

+ 11 - 0
tests/regressiontests/staticfiles_tests/tests.py

@@ -387,6 +387,17 @@ class TestCollectionCachedStorage(BaseCollectionTestCase,
             self.assertNotIn(b"cached/other.css", content)
             self.assertIn(b"other.d41d8cd98f00.css", content)
 
+    def test_path_ignored_completely(self):
+        relpath = self.cached_file_path("cached/css/ignored.css")
+        self.assertEqual(relpath, "cached/css/ignored.6c77f2643390.css")
+        with storage.staticfiles_storage.open(relpath) as relfile:
+            content = relfile.read()
+            self.assertIn(b'#foobar', content)
+            self.assertIn(b'http:foobar', content)
+            self.assertIn(b'https:foobar', content)
+            self.assertIn(b'data:foobar', content)
+            self.assertIn(b'//foobar', content)
+
     def test_path_with_querystring(self):
         relpath = self.cached_file_path("cached/styles.css?spam=eggs")
         self.assertEqual(relpath,