From 933f1501e84240b72e6da93ab3e43714017b44db Mon Sep 17 00:00:00 2001 From: Brian Clozel Date: Mon, 12 Dec 2016 15:14:50 +0100 Subject: [PATCH] Do not include URL hash in resource paths When getting the lookup path of a resource, both query params and hashes should be removed from the request path. This commit fixes the public path resolution for paths like `/resources/main.svg#icon-hamburgermenu`. Issue: SPR-14928 --- .../reactive/resource/ResourceUrlProvider.java | 16 ++++++++++++---- .../resource/ResourceUrlProviderTests.java | 6 +++++- .../servlet/resource/ResourceUrlProvider.java | 16 ++++++++++++---- .../resource/ResourceUrlProviderTests.java | 6 +++++- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java index 950e870019..bbdc67449c 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/resource/ResourceUrlProvider.java @@ -174,7 +174,7 @@ public class ResourceUrlProvider implements ApplicationListener 0 ? index : lookupPath.length(); + private int getEndPathIndex(String lookupPath) { + int suffixIndex = lookupPath.length(); + int queryIndex = lookupPath.indexOf("?"); + if(queryIndex > 0) { + suffixIndex = queryIndex; + } + int hashIndex = lookupPath.indexOf("#"); + if(hashIndex > 0) { + suffixIndex = Math.min(suffixIndex, hashIndex); + } + return suffixIndex; } /** diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java index 556f2c672e..f42bb13f27 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/resource/ResourceUrlProviderTests.java @@ -79,7 +79,7 @@ public class ResourceUrlProviderTests { } @Test // SPR-13374 - public void getStaticResourceUrlRequestWithRequestParams() { + public void getStaticResourceUrlRequestWithQueryOrHash() { MockServerHttpRequest request = new MockServerHttpRequest(HttpMethod.GET, "/"); MockServerHttpResponse response = new MockServerHttpResponse(); WebSessionManager manager = new DefaultWebSessionManager(); @@ -88,6 +88,10 @@ public class ResourceUrlProviderTests { String url = "/resources/foo.css?foo=bar&url=http://example.org"; String resolvedUrl = this.urlProvider.getForRequestUrl(exchange, url).blockMillis(5000); assertEquals(url, resolvedUrl); + + url = "/resources/foo.css#hash"; + resolvedUrl = this.urlProvider.getForRequestUrl(exchange, url).blockMillis(5000); + assertEquals(url, resolvedUrl); } @Test 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 0f18ac842d..b96aae8380 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 @@ -173,7 +173,7 @@ public class ResourceUrlProvider implements ApplicationListener 0 ? index : lookupPath.length(); + private int getEndPathIndex(String lookupPath) { + int suffixIndex = lookupPath.length(); + int queryIndex = lookupPath.indexOf("?"); + if(queryIndex > 0) { + suffixIndex = queryIndex; + } + int hashIndex = lookupPath.indexOf("#"); + if(hashIndex > 0) { + suffixIndex = Math.min(suffixIndex, hashIndex); + } + return suffixIndex; } /** diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java index b618099aea..8a3054d280 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/resource/ResourceUrlProviderTests.java @@ -73,7 +73,7 @@ public class ResourceUrlProviderTests { } @Test // SPR-13374 - public void getStaticResourceUrlRequestWithRequestParams() { + public void getStaticResourceUrlRequestWithQueryOrHash() { MockHttpServletRequest request = new MockHttpServletRequest(); request.setContextPath("/"); request.setRequestURI("/"); @@ -81,6 +81,10 @@ public class ResourceUrlProviderTests { String url = "/resources/foo.css?foo=bar&url=http://example.org"; String resolvedUrl = this.urlProvider.getForRequestUrl(request, url); assertEquals("/resources/foo.css?foo=bar&url=http://example.org", resolvedUrl); + + url = "/resources/foo.css#hash"; + resolvedUrl = this.urlProvider.getForRequestUrl(request, url); + assertEquals("/resources/foo.css#hash", resolvedUrl); } @Test