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
This commit is contained in:
Brian Clozel 2016-12-12 15:14:50 +01:00
parent 1a6dc86fed
commit b59455b63c
2 changed files with 20 additions and 7 deletions

View File

@ -181,7 +181,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
logger.trace("Getting resource URL for request URL \"" + requestUrl + "\""); logger.trace("Getting resource URL for request URL \"" + requestUrl + "\"");
} }
int prefixIndex = getLookupPathIndex(request); int prefixIndex = getLookupPathIndex(request);
int suffixIndex = getQueryParamsIndex(requestUrl); int suffixIndex = getEndPathIndex(requestUrl);
String prefix = requestUrl.substring(0, prefixIndex); String prefix = requestUrl.substring(0, prefixIndex);
String suffix = requestUrl.substring(suffixIndex); String suffix = requestUrl.substring(suffixIndex);
String lookupPath = requestUrl.substring(prefixIndex, suffixIndex); String lookupPath = requestUrl.substring(prefixIndex, suffixIndex);
@ -196,9 +196,17 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
return requestUri.indexOf(lookupPath); return requestUri.indexOf(lookupPath);
} }
private int getQueryParamsIndex(String lookupPath) { private int getEndPathIndex(String lookupPath) {
int index = lookupPath.indexOf("?"); int suffixIndex = lookupPath.length();
return index > 0 ? index : 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;
} }
/** /**

View File

@ -73,13 +73,18 @@ public class ResourceUrlProviderTests {
} }
@Test // SPR-13374 @Test // SPR-13374
public void getStaticResourceUrlRequestWithRequestParams() { public void getStaticResourceUrlRequestWithQueryOrHash() {
MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletRequest request = new MockHttpServletRequest();
request.setContextPath("/"); request.setContextPath("/");
request.setRequestURI("/"); request.setRequestURI("/");
String url = this.urlProvider.getForRequestUrl(request, "/resources/foo.css?foo=bar&url=http://example.org"); String url = "/resources/foo.css?foo=bar&url=http://example.org";
assertEquals("/resources/foo.css?foo=bar&url=http://example.org", url); 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 @Test