Fix absolute paths when transforming resources
Prior to this commit, `ResourceTransformerSupport.toAbsolutePath` would call `StringUtils.applyRelativePath` in all cases. But this implementation is prepending the given path even if the relative path starts with `"/"`. This commit skips the entire operation if the given path is absolute, i.e. it starts with `"/"`. Issue: SPR-17432
This commit is contained in:
@@ -96,7 +96,7 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer
|
|||||||
*/
|
*/
|
||||||
protected String toAbsolutePath(String path, ServerWebExchange exchange) {
|
protected String toAbsolutePath(String path, ServerWebExchange exchange) {
|
||||||
String requestPath = exchange.getRequest().getURI().getPath();
|
String requestPath = exchange.getRequest().getURI().getPath();
|
||||||
String absolutePath = StringUtils.applyRelativePath(requestPath, path);
|
String absolutePath = path.startsWith("/") ? path : StringUtils.applyRelativePath(requestPath, path);
|
||||||
return StringUtils.cleanPath(absolutePath);
|
return StringUtils.cleanPath(absolutePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -106,6 +106,16 @@ public class ResourceTransformerSupportTests {
|
|||||||
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
|
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toAbsolutePath() {
|
||||||
|
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/resources/main.css"));
|
||||||
|
String absolute = this.transformer.toAbsolutePath("img/image.png", exchange);
|
||||||
|
assertEquals("/resources/img/image.png", absolute);
|
||||||
|
|
||||||
|
absolute = this.transformer.toAbsolutePath("/img/image.png", exchange);
|
||||||
|
assertEquals("/img/image.png", absolute);
|
||||||
|
}
|
||||||
|
|
||||||
private Resource getResource(String filePath) {
|
private Resource getResource(String filePath) {
|
||||||
return new ClassPathResource("test/" + filePath, getClass());
|
return new ClassPathResource("test/" + filePath, getClass());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,10 +94,13 @@ public abstract class ResourceTransformerSupport implements ResourceTransformer
|
|||||||
* @return the absolute request path for the given resource path
|
* @return the absolute request path for the given resource path
|
||||||
*/
|
*/
|
||||||
protected String toAbsolutePath(String path, HttpServletRequest request) {
|
protected String toAbsolutePath(String path, HttpServletRequest request) {
|
||||||
ResourceUrlProvider urlProvider = findResourceUrlProvider(request);
|
String absolutePath = path;
|
||||||
Assert.state(urlProvider != null, "No ResourceUrlProvider");
|
if(!path.startsWith("/")) {
|
||||||
String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request);
|
ResourceUrlProvider urlProvider = findResourceUrlProvider(request);
|
||||||
String absolutePath = StringUtils.applyRelativePath(requestPath, path);
|
Assert.state(urlProvider != null, "No ResourceUrlProvider");
|
||||||
|
String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request);
|
||||||
|
absolutePath = StringUtils.applyRelativePath(requestPath, path);
|
||||||
|
}
|
||||||
return StringUtils.cleanPath(absolutePath);
|
return StringUtils.cleanPath(absolutePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class ResourceTransformerSupportTests {
|
|||||||
|
|
||||||
private TestResourceTransformerSupport transformer;
|
private TestResourceTransformerSupport transformer;
|
||||||
|
|
||||||
private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "");
|
private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
|
||||||
|
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -98,6 +98,17 @@ public class ResourceTransformerSupportTests {
|
|||||||
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
|
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toAbsolutePath() {
|
||||||
|
String absolute = this.transformer.toAbsolutePath("img/image.png",
|
||||||
|
new MockHttpServletRequest("GET", "/resources/style.css"));
|
||||||
|
assertEquals("/resources/img/image.png", absolute);
|
||||||
|
|
||||||
|
absolute = this.transformer.toAbsolutePath("/img/image.png",
|
||||||
|
new MockHttpServletRequest("GET", "/resources/style.css"));
|
||||||
|
assertEquals("/img/image.png", absolute);
|
||||||
|
}
|
||||||
|
|
||||||
private Resource getResource(String filePath) {
|
private Resource getResource(String filePath) {
|
||||||
return new ClassPathResource("test/" + filePath, getClass());
|
return new ClassPathResource("test/" + filePath, getClass());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user