Browse Source

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
pull/2000/head
Brian Clozel 7 years ago
parent
commit
2146e13787
  1. 2
      spring-webflux/src/main/java/org/springframework/web/reactive/resource/ResourceTransformerSupport.java
  2. 10
      spring-webflux/src/test/java/org/springframework/web/reactive/resource/ResourceTransformerSupportTests.java
  3. 11
      spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceTransformerSupport.java
  4. 13
      spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java

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

@ -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);
} }

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

@ -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());
} }

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

@ -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);
} }

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

@ -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());
} }

Loading…
Cancel
Save