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
This commit is contained in:
@@ -123,7 +123,8 @@ public class CssLinkResourceTransformer extends ResourceTransformerSupport {
|
|||||||
|
|
||||||
private boolean hasScheme(String link) {
|
private boolean hasScheme(String link) {
|
||||||
int schemeIndex = link.indexOf(":");
|
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;
|
TransformedResource transformedResource = (TransformedResource) resource;
|
||||||
|
|
||||||
String expected = "@import url(\"http://example.org/fonts/css\");\n" +
|
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");
|
String result = new String(transformedResource.getByteArray(), "UTF-8");
|
||||||
result = StringUtils.deleteAny(result, "\r");
|
result = StringUtils.deleteAny(result, "\r");
|
||||||
assertEquals(expected, result);
|
assertEquals(expected, result);
|
||||||
@@ -108,6 +109,8 @@ public class CssLinkResourceTransformerTests {
|
|||||||
.resolveUrlPath("http://example.org/fonts/css", Arrays.asList(externalCss));
|
.resolveUrlPath("http://example.org/fonts/css", Arrays.asList(externalCss));
|
||||||
Mockito.verify(resolverChain, Mockito.never())
|
Mockito.verify(resolverChain, Mockito.never())
|
||||||
.resolveUrlPath("file:///home/spring/image.png", Arrays.asList(externalCss));
|
.resolveUrlPath("file:///home/spring/image.png", Arrays.asList(externalCss));
|
||||||
|
Mockito.verify(resolverChain, Mockito.never())
|
||||||
|
.resolveUrlPath("//example.org/style.css", Arrays.asList(externalCss));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
@import url("http://example.org/fonts/css");
|
@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")}
|
||||||
Reference in New Issue
Block a user