Skip to content

Commit 2146e13

Browse files
committed
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
1 parent a61d107 commit 2146e13

File tree

4 files changed

+30
-6
lines changed

4 files changed

+30
-6
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ protected Mono<String> resolveUrlPath(String resourcePath, ServerWebExchange exc
9696
*/
9797
protected String toAbsolutePath(String path, ServerWebExchange exchange) {
9898
String requestPath = exchange.getRequest().getURI().getPath();
99-
String absolutePath = StringUtils.applyRelativePath(requestPath, path);
99+
String absolutePath = path.startsWith("/") ? path : StringUtils.applyRelativePath(requestPath, path);
100100
return StringUtils.cleanPath(absolutePath);
101101
}
102102

spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,16 @@ public void resolveUrlPathWithRelativePathInParentDirectory() {
106106
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
107107
}
108108

109+
@Test
110+
public void toAbsolutePath() {
111+
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/resources/main.css"));
112+
String absolute = this.transformer.toAbsolutePath("img/image.png", exchange);
113+
assertEquals("/resources/img/image.png", absolute);
114+
115+
absolute = this.transformer.toAbsolutePath("/img/image.png", exchange);
116+
assertEquals("/img/image.png", absolute);
117+
}
118+
109119
private Resource getResource(String filePath) {
110120
return new ClassPathResource("test/" + filePath, getClass());
111121
}

spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,10 +94,13 @@ protected String resolveUrlPath(String resourcePath, HttpServletRequest request,
9494
* @return the absolute request path for the given resource path
9595
*/
9696
protected String toAbsolutePath(String path, HttpServletRequest request) {
97-
ResourceUrlProvider urlProvider = findResourceUrlProvider(request);
98-
Assert.state(urlProvider != null, "No ResourceUrlProvider");
99-
String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request);
100-
String absolutePath = StringUtils.applyRelativePath(requestPath, path);
97+
String absolutePath = path;
98+
if(!path.startsWith("/")) {
99+
ResourceUrlProvider urlProvider = findResourceUrlProvider(request);
100+
Assert.state(urlProvider != null, "No ResourceUrlProvider");
101+
String requestPath = urlProvider.getUrlPathHelper().getRequestUri(request);
102+
absolutePath = StringUtils.applyRelativePath(requestPath, path);
103+
}
101104
return StringUtils.cleanPath(absolutePath);
102105
}
103106

spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class ResourceTransformerSupportTests {
4141

4242
private TestResourceTransformerSupport transformer;
4343

44-
private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "");
44+
private final MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
4545

4646

4747
@Before
@@ -98,6 +98,17 @@ public void resolveUrlPathWithRelativePathInParentDirectory() {
9898
assertEquals("../bar-11e16cf79faee7ac698c805cf28248d2.css", actual);
9999
}
100100

101+
@Test
102+
public void toAbsolutePath() {
103+
String absolute = this.transformer.toAbsolutePath("img/image.png",
104+
new MockHttpServletRequest("GET", "/resources/style.css"));
105+
assertEquals("/resources/img/image.png", absolute);
106+
107+
absolute = this.transformer.toAbsolutePath("/img/image.png",
108+
new MockHttpServletRequest("GET", "/resources/style.css"));
109+
assertEquals("/img/image.png", absolute);
110+
}
111+
101112
private Resource getResource(String filePath) {
102113
return new ClassPathResource("test/" + filePath, getClass());
103114
}

0 commit comments

Comments
 (0)