|
|
|
@ -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); |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|