From 028c0e8b809dcfd641d290de4eda0e48c08fd5f2 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Tue, 20 Jan 2015 15:10:54 +0100 Subject: [PATCH] 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 --- .../web/servlet/resource/CssLinkResourceTransformer.java | 3 ++- .../servlet/resource/CssLinkResourceTransformerTests.java | 5 ++++- .../springframework/web/servlet/resource/test/external.css | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CssLinkResourceTransformer.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CssLinkResourceTransformer.java index d35fe16ba8..4380246e84 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CssLinkResourceTransformer.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/CssLinkResourceTransformer.java @@ -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; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java index dd509d63b5..05703e0804 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/CssLinkResourceTransformerTests.java @@ -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 diff --git a/spring-webmvc/src/test/resources/org/springframework/web/servlet/resource/test/external.css b/spring-webmvc/src/test/resources/org/springframework/web/servlet/resource/test/external.css index aa0afb2bbc..d21e42aaf2 100644 --- a/spring-webmvc/src/test/resources/org/springframework/web/servlet/resource/test/external.css +++ b/spring-webmvc/src/test/resources/org/springframework/web/servlet/resource/test/external.css @@ -1,2 +1,3 @@ @import url("http://example.org/fonts/css"); -body { background: url("file:///home/spring/image.png") } \ No newline at end of file +body { background: url("file:///home/spring/image.png") } +figure { background: url("//example.org/style.css")} \ No newline at end of file