Skip to content

Commit 933f150

Browse files
committed
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
1 parent 66e6b35 commit 933f150

File tree

4 files changed

+34
-10
lines changed

4 files changed

+34
-10
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ public final Mono<String> getForRequestUrl(ServerWebExchange exchange, String re
174174
logger.trace("Getting resource URL for request URL \"" + requestUrl + "\"");
175175
}
176176
int prefixIndex = getLookupPathIndex(exchange);
177-
int suffixIndex = getQueryParamsIndex(requestUrl);
177+
int suffixIndex = getEndPathIndex(requestUrl);
178178
String prefix = requestUrl.substring(0, prefixIndex);
179179
String suffix = requestUrl.substring(suffixIndex);
180180
String lookupPath = requestUrl.substring(prefixIndex, suffixIndex);
@@ -188,9 +188,17 @@ private int getLookupPathIndex(ServerWebExchange exchange) {
188188
return requestPath.indexOf(lookupPath);
189189
}
190190

191-
private int getQueryParamsIndex(String lookupPath) {
192-
int index = lookupPath.indexOf("?");
193-
return index > 0 ? index : lookupPath.length();
191+
private int getEndPathIndex(String lookupPath) {
192+
int suffixIndex = lookupPath.length();
193+
int queryIndex = lookupPath.indexOf("?");
194+
if(queryIndex > 0) {
195+
suffixIndex = queryIndex;
196+
}
197+
int hashIndex = lookupPath.indexOf("#");
198+
if(hashIndex > 0) {
199+
suffixIndex = Math.min(suffixIndex, hashIndex);
200+
}
201+
return suffixIndex;
194202
}
195203

196204
/**

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public void getStaticResourceUrl() {
7979
}
8080

8181
@Test // SPR-13374
82-
public void getStaticResourceUrlRequestWithRequestParams() {
82+
public void getStaticResourceUrlRequestWithQueryOrHash() {
8383
MockServerHttpRequest request = new MockServerHttpRequest(HttpMethod.GET, "/");
8484
MockServerHttpResponse response = new MockServerHttpResponse();
8585
WebSessionManager manager = new DefaultWebSessionManager();
@@ -88,6 +88,10 @@ public void getStaticResourceUrlRequestWithRequestParams() {
8888
String url = "/resources/foo.css?foo=bar&url=http://example.org";
8989
String resolvedUrl = this.urlProvider.getForRequestUrl(exchange, url).blockMillis(5000);
9090
assertEquals(url, resolvedUrl);
91+
92+
url = "/resources/foo.css#hash";
93+
resolvedUrl = this.urlProvider.getForRequestUrl(exchange, url).blockMillis(5000);
94+
assertEquals(url, resolvedUrl);
9195
}
9296

9397
@Test

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public final String getForRequestUrl(HttpServletRequest request, String requestU
173173
logger.trace("Getting resource URL for request URL \"" + requestUrl + "\"");
174174
}
175175
int prefixIndex = getLookupPathIndex(request);
176-
int suffixIndex = getQueryParamsIndex(requestUrl);
176+
int suffixIndex = getEndPathIndex(requestUrl);
177177
String prefix = requestUrl.substring(0, prefixIndex);
178178
String suffix = requestUrl.substring(suffixIndex);
179179
String lookupPath = requestUrl.substring(prefixIndex, suffixIndex);
@@ -188,9 +188,17 @@ private int getLookupPathIndex(HttpServletRequest request) {
188188
return requestUri.indexOf(lookupPath);
189189
}
190190

191-
private int getQueryParamsIndex(String lookupPath) {
192-
int index = lookupPath.indexOf("?");
193-
return index > 0 ? index : lookupPath.length();
191+
private int getEndPathIndex(String lookupPath) {
192+
int suffixIndex = lookupPath.length();
193+
int queryIndex = lookupPath.indexOf("?");
194+
if(queryIndex > 0) {
195+
suffixIndex = queryIndex;
196+
}
197+
int hashIndex = lookupPath.indexOf("#");
198+
if(hashIndex > 0) {
199+
suffixIndex = Math.min(suffixIndex, hashIndex);
200+
}
201+
return suffixIndex;
194202
}
195203

196204
/**

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,18 @@ public void getStaticResourceUrl() {
7373
}
7474

7575
@Test // SPR-13374
76-
public void getStaticResourceUrlRequestWithRequestParams() {
76+
public void getStaticResourceUrlRequestWithQueryOrHash() {
7777
MockHttpServletRequest request = new MockHttpServletRequest();
7878
request.setContextPath("/");
7979
request.setRequestURI("/");
8080

8181
String url = "/resources/foo.css?foo=bar&url=http://example.org";
8282
String resolvedUrl = this.urlProvider.getForRequestUrl(request, url);
8383
assertEquals("/resources/foo.css?foo=bar&url=http://example.org", resolvedUrl);
84+
85+
url = "/resources/foo.css#hash";
86+
resolvedUrl = this.urlProvider.getForRequestUrl(request, url);
87+
assertEquals("/resources/foo.css#hash", resolvedUrl);
8488
}
8589

8690
@Test

0 commit comments

Comments
 (0)