Allow protocol relative URLs in CssLink Transformer

This commit allows the use of "protcol relative URLs" (i.e. URLs without
scheme, starting with `//`), often used to serve resources automatically
from https or http with third party domains.

This syntax is allowed by RFC 3986.

Issue: SPR-12632
master
Brian Clozel 10 years ago
parent bf7a9754d5
commit 028c0e8b80
  1. 3
      spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CssLinkResourceTransformer.java
  2. 5
      spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java
  3. 3
      spring-webmvc/src/test/resources/org/springframework/web/servlet/resource/test/external.css

@ -123,7 +123,8 @@ public class CssLinkResourceTransformer extends ResourceTransformerSupport {
private boolean hasScheme(String link) {
int schemeIndex = link.indexOf(":");
return schemeIndex > 0 && !link.substring(0, schemeIndex).contains("/");
return (schemeIndex > 0 && !link.substring(0, schemeIndex).contains("/"))
|| link.indexOf("//") == 0;
}

@ -99,7 +99,8 @@ public class CssLinkResourceTransformerTests {
TransformedResource transformedResource = (TransformedResource) resource;
String expected = "@import url(\"http://example.org/fonts/css\");\n" +
"body { background: url(\"file:///home/spring/image.png\") }";
"body { background: url(\"file:///home/spring/image.png\") }\n" +
"figure { background: url(\"//example.org/style.css\")}";
String result = new String(transformedResource.getByteArray(), "UTF-8");
result = StringUtils.deleteAny(result, "\r");
assertEquals(expected, result);
@ -108,6 +109,8 @@ public class CssLinkResourceTransformerTests {
.resolveUrlPath("http://example.org/fonts/css", Arrays.asList(externalCss));
Mockito.verify(resolverChain, Mockito.never())
.resolveUrlPath("file:///home/spring/image.png", Arrays.asList(externalCss));
Mockito.verify(resolverChain, Mockito.never())
.resolveUrlPath("//example.org/style.css", Arrays.asList(externalCss));
}
@Test

@ -1,2 +1,3 @@
@import url("http://example.org/fonts/css");
body { background: url("file:///home/spring/image.png") }
body { background: url("file:///home/spring/image.png") }
figure { background: url("//example.org/style.css")}
Loading…
Cancel
Save