Browse Source

Fixed #29022 -- Fixed handling protocol-relative URLs in ManifestStaticFilesStorage when STATIC_URL is set to /.

Adam Zapletal 1 year ago
parent
commit
107aa76bcf

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

@@ -221,7 +221,7 @@ class HashedFilesMixin:
             url = matches["url"]
 
             # Ignore absolute/protocol-relative and data-uri URLs.
-            if re.match(r"^[a-z]+:", url):
+            if re.match(r"^[a-z]+:", url) or url.startswith("//"):
                 return matched
 
             # Ignore absolute URLs that don't point to a static file (dynamic

+ 3 - 0
tests/staticfiles_tests/project/static_url_slash/ignored.css

@@ -0,0 +1,3 @@
+body {
+    background: url("//foobar");
+}

+ 27 - 1
tests/staticfiles_tests/test_storage.py

@@ -22,7 +22,7 @@ from .settings import TEST_ROOT
 
 def hashed_file_path(test, path):
     fullpath = test.render_template(test.static_template_snippet(path))
-    return fullpath.replace(settings.STATIC_URL, "")
+    return fullpath.removeprefix(settings.STATIC_URL)
 
 
 class TestHashedFiles:
@@ -560,6 +560,32 @@ class TestCollectionManifestStorage(TestHashedFiles, CollectionTestCase):
         self.assertEqual(manifest_content, {"dummy.txt": "dummy.txt"})
 
 
+@override_settings(
+    STATIC_URL="/",
+    STORAGES={
+        **settings.STORAGES,
+        STATICFILES_STORAGE_ALIAS: {
+            "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage",
+        },
+    },
+)
+class TestCollectionManifestStorageStaticUrlSlash(CollectionTestCase):
+    run_collectstatic_in_setUp = False
+    hashed_file_path = hashed_file_path
+
+    def test_protocol_relative_url_ignored(self):
+        with override_settings(
+            STATICFILES_DIRS=[os.path.join(TEST_ROOT, "project", "static_url_slash")],
+            STATICFILES_FINDERS=["django.contrib.staticfiles.finders.FileSystemFinder"],
+        ):
+            self.run_collectstatic()
+        relpath = self.hashed_file_path("ignored.css")
+        self.assertEqual(relpath, "ignored.61707f5f4942.css")
+        with storage.staticfiles_storage.open(relpath) as relfile:
+            content = relfile.read()
+            self.assertIn(b"//foobar", content)
+
+
 @override_settings(
     STORAGES={
         **settings.STORAGES,