This commit is contained in:
Rossen Stoyanchev 2018-11-26 16:00:47 -05:00
parent 959cf61647
commit 3eee118b44
2 changed files with 38 additions and 73 deletions

View File

@ -126,17 +126,16 @@ public class ResourceUrlEncodingFilter extends GenericFilterBean {
return null; return null;
} }
private int getEndPathIndex(String lookupPath) { private int getEndPathIndex(String path) {
int suffixIndex = lookupPath.length(); int end = path.indexOf('?');
int queryIndex = lookupPath.indexOf('?'); int fragmentIndex = path.indexOf('#');
if (queryIndex > 0) { if (fragmentIndex != -1 && (end == -1 || fragmentIndex < end)) {
suffixIndex = queryIndex; end = fragmentIndex;
} }
int hashIndex = lookupPath.indexOf('#'); if (end == -1) {
if (hashIndex > 0) { end = path.length();
suffixIndex = Math.min(suffixIndex, hashIndex);
} }
return suffixIndex; return end;
} }
} }

View File

@ -15,9 +15,11 @@
*/ */
package org.springframework.web.servlet.resource; package org.springframework.web.servlet.resource;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.junit.Before; import org.junit.Before;
@ -68,27 +70,17 @@ public class ResourceUrlEncodingFilterTests {
@Test @Test
public void encodeURL() throws Exception { public void encodeURL() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/"); testEncodeUrl(new MockHttpServletRequest("GET", "/"),
MockHttpServletResponse response = new MockHttpServletResponse(); "/resources/bar.css", "/resources/bar-11e16cf79faee7ac698c805cf28248d2.css");
this.filter.doFilter(request, response, (req, res) -> {
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider);
String result = ((HttpServletResponse) res).encodeURL("/resources/bar.css");
assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", result);
});
} }
@Test @Test
public void encodeURLWithContext() throws Exception { public void encodeUrlWithContext() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo");
request.setContextPath("/context"); request.setContextPath("/context");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "/context/resources/bar.css",
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); "/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css");
String result = ((HttpServletResponse) res).encodeURL("/context/resources/bar.css");
assertEquals("/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", result);
});
} }
@ -96,9 +88,8 @@ public class ResourceUrlEncodingFilterTests {
public void encodeUrlWithContextAndForwardedRequest() throws Exception { public void encodeUrlWithContextAndForwardedRequest() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo");
request.setContextPath("/context"); request.setContextPath("/context");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { this.filter.doFilter(request, new MockHttpServletResponse(), (req, res) -> {
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider);
request.setRequestURI("/forwarded"); request.setRequestURI("/forwarded");
request.setContextPath("/"); request.setContextPath("/");
@ -111,52 +102,35 @@ public class ResourceUrlEncodingFilterTests {
public void encodeContextPathUrlWithoutSuffix() throws Exception { public void encodeContextPathUrlWithoutSuffix() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context");
request.setContextPath("/context"); request.setContextPath("/context");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "/context/resources/bar.css",
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); "/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css");
String result = ((HttpServletResponse) res).encodeURL("/context/resources/bar.css");
assertEquals("/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", result);
});
} }
@Test @Test
public void encodeContextPathUrlWithSuffix() throws Exception { public void encodeContextPathUrlWithSuffix() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/");
request.setContextPath("/context"); request.setContextPath("/context");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "/context/resources/bar.css",
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); "/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css");
String result = ((HttpServletResponse) res).encodeURL("/context/resources/bar.css");
assertEquals("/context/resources/bar-11e16cf79faee7ac698c805cf28248d2.css", result);
});
} }
@Test // SPR-13018 @Test // SPR-13018
public void encodeEmptyURLWithContext() throws Exception { public void encodeEmptyUrlWithContext() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context/foo");
request.setContextPath("/context"); request.setContextPath("/context");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "?foo=1", "?foo=1");
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider);
String result = ((HttpServletResponse) res).encodeURL("?foo=1");
assertEquals("?foo=1", result);
});
} }
@Test // SPR-13374 @Test // SPR-13374
public void encodeURLWithRequestParams() throws Exception { public void encodeUrlWithRequestParams() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.setContextPath("/"); request.setContextPath("/");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "/resources/bar.css?foo=bar&url=http://example.org",
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); "/resources/bar-11e16cf79faee7ac698c805cf28248d2.css?foo=bar&url=http://example.org");
String result = ((HttpServletResponse) res).encodeURL("/resources/bar.css?foo=bar&url=http://example.org");
assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css?foo=bar&url=http://example.org", result);
});
} }
@Test // SPR-13847 @Test // SPR-13847
@ -164,38 +138,30 @@ public class ResourceUrlEncodingFilterTests {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context-path/index"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/context-path/index");
request.setContextPath("/context-path"); request.setContextPath("/context-path");
request.setServletPath(""); request.setServletPath("");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "index?key=value", "index?key=value");
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider);
String result = ((HttpServletResponse) res).encodeURL("index?key=value");
assertEquals("index?key=value", result);
});
} }
@Test // SPR-17535 @Test // SPR-17535
public void encodeURLWitFragment() throws Exception { public void encodeUrlWithFragment() throws Exception {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo"); MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.setContextPath("/"); request.setContextPath("/");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { testEncodeUrl(request, "/resources/bar.css#something",
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); "/resources/bar-11e16cf79faee7ac698c805cf28248d2.css#something");
String result = ((HttpServletResponse) res).encodeURL("/resources/bar.css#something");
assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css#something", result); testEncodeUrl(request,
}); "/resources/bar.css?foo=bar&url=http://example.org#something",
"/resources/bar-11e16cf79faee7ac698c805cf28248d2.css?foo=bar&url=http://example.org#something");
} }
@Test // SPR-13374 and SPR-17535 combined private void testEncodeUrl(MockHttpServletRequest request, String url, String expected)
public void encodeURLWitFragmentAndRequestParams() throws Exception { throws ServletException, IOException {
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo");
request.setContextPath("/");
MockHttpServletResponse response = new MockHttpServletResponse();
this.filter.doFilter(request, response, (req, res) -> { this.filter.doFilter(request, new MockHttpServletResponse(), (req, res) -> {
req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider); req.setAttribute(ResourceUrlProviderExposingInterceptor.RESOURCE_URL_PROVIDER_ATTR, this.urlProvider);
String result = ((HttpServletResponse) res).encodeURL("/resources/bar.css?foo=bar&url=http://example.org#something"); String result = ((HttpServletResponse) res).encodeURL(url);
assertEquals("/resources/bar-11e16cf79faee7ac698c805cf28248d2.css?foo=bar&url=http://example.org#something", result); assertEquals(expected, result);
}); });
} }