From 6aef1a1d1736d8c3b936cda0409982a6f306f973 Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Fri, 5 Sep 2014 22:46:13 +0200 Subject: [PATCH] Fix ResourceUrlProvider path check in getForRequestUrl Prior to this change, getForRequestUrl implementation would only work for applications with a non-empty servlet path. So web applications mapped to "/" would trigger a IllegalStateException while checking the current request against the request path within the current mapping. This change relaxes this and only check that the path within mapping is within the request URL. Issue: SPR-12158 --- .../servlet/resource/ResourceUrlProvider.java | 2 +- .../ResourceTransformerSupportTests.java | 27 ++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java index 519526fefe..41dc298aac 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/resource/ResourceUrlProvider.java @@ -180,7 +180,7 @@ public class ResourceUrlProvider implements ApplicationListener 0 && index < requestUrl.length(), "Failed to determine lookup path: " + requestUrl); + Assert.state(index != -1, "Failed to determine lookup path: " + requestUrl); String prefix = requestUrl.substring(0, index); String lookupPath = requestUrl.substring(index); diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java index b9f389e406..f3f2f96082 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceTransformerSupportTests.java @@ -73,7 +73,7 @@ public class ResourceTransformerSupportTests { } @Test - public void rewriteAbsolutePath() throws Exception { + public void rewriteAbsolutePathWithContext() throws Exception { this.request.setRequestURI("/servlet/context/resources/main.css"); this.request.setMethod("GET"); this.request.setServletPath("/servlet"); @@ -84,6 +84,18 @@ public class ResourceTransformerSupportTests { Resource mainCss = new ClassPathResource("test/main.css", getClass()); String actual = this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); assertEquals("/servlet/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); + } + + @Test + public void rewriteAbsolutePath() throws Exception { + this.request.setRequestURI("/resources/main.css"); + this.request.setMethod("GET"); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/resources/main.css"); + + String resourcePath = "/resources/bar.css"; + Resource mainCss = new ClassPathResource("test/main.css", getClass()); + String actual = this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); + assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", actual); actual = this.transformer.resolveUrlPath("bar.css", this.request, mainCss, this.transformerChain); assertEquals("bar-11e16cf79faee7ac698c805cf28248d2.css", actual); @@ -102,6 +114,19 @@ public class ResourceTransformerSupportTests { assertEquals("bar-11e16cf79faee7ac698c805cf28248d2.css", actual); } + @Test(expected = IllegalStateException.class) + public void rewriteAbsolutePathWrongPath() throws Exception { + this.request.setRequestURI("/servlet/context/resources/main.css"); + this.request.setMethod("GET"); + this.request.setServletPath("/servlet"); + this.request.setContextPath("/context"); + this.request.setAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE, "/wrong/main.css"); + + String resourcePath = "/servlet/context/resources/bar.css"; + Resource mainCss = new ClassPathResource("test/main.css", getClass()); + this.transformer.resolveUrlPath(resourcePath, this.request, mainCss, this.transformerChain); + } + @Test public void rewriteRelativePathUpperLevel() throws Exception { this.request.setRequestURI("/servlet/context/resources/images/image.png");