AntPathRequestMatcher supports UrlPathHelper

Fixes: gh-5846
This commit is contained in:
Rob Winch 2018-09-14 08:58:30 -05:00
parent 17dd95d525
commit 8b19f7a71a
2 changed files with 31 additions and 0 deletions

View File

@ -27,6 +27,7 @@ import org.springframework.http.HttpMethod;
import org.springframework.util.AntPathMatcher; import org.springframework.util.AntPathMatcher;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.util.UrlPathHelper;
/** /**
* Matcher which compares a pre-defined ant-style pattern against the URL ( * Matcher which compares a pre-defined ant-style pattern against the URL (
@ -62,6 +63,8 @@ public final class AntPathRequestMatcher
private final HttpMethod httpMethod; private final HttpMethod httpMethod;
private final boolean caseSensitive; private final boolean caseSensitive;
private final UrlPathHelper urlPathHelper;
/** /**
* Creates a matcher with the specific pattern which will match all HTTP methods in a * Creates a matcher with the specific pattern which will match all HTTP methods in a
* case insensitive manner. * case insensitive manner.
@ -95,6 +98,21 @@ public final class AntPathRequestMatcher
*/ */
public AntPathRequestMatcher(String pattern, String httpMethod, public AntPathRequestMatcher(String pattern, String httpMethod,
boolean caseSensitive) { boolean caseSensitive) {
this(pattern, httpMethod, caseSensitive, null);
}
/**
* Creates a matcher with the supplied pattern which will match the specified Http
* method
*
* @param pattern the ant pattern to use for matching
* @param httpMethod the HTTP method. The {@code matches} method will return false if
* the incoming request doesn't doesn't have the same method.
* @param caseSensitive true if the matcher should consider case, else false
* @param urlPathHelper if non-null, will be used for extracting the path from the HttpServletRequest
*/
public AntPathRequestMatcher(String pattern, String httpMethod,
boolean caseSensitive, UrlPathHelper urlPathHelper) {
Assert.hasText(pattern, "Pattern cannot be null or empty"); Assert.hasText(pattern, "Pattern cannot be null or empty");
this.caseSensitive = caseSensitive; this.caseSensitive = caseSensitive;
@ -120,6 +138,7 @@ public final class AntPathRequestMatcher
this.pattern = pattern; this.pattern = pattern;
this.httpMethod = StringUtils.hasText(httpMethod) ? HttpMethod.valueOf(httpMethod) this.httpMethod = StringUtils.hasText(httpMethod) ? HttpMethod.valueOf(httpMethod)
: null; : null;
this.urlPathHelper = urlPathHelper;
} }
/** /**
@ -171,6 +190,9 @@ public final class AntPathRequestMatcher
} }
private String getRequestPath(HttpServletRequest request) { private String getRequestPath(HttpServletRequest request) {
if (this.urlPathHelper != null) {
return this.urlPathHelper.getPathWithinApplication(request);
}
String url = request.getServletPath(); String url = request.getServletPath();
String pathInfo = request.getPathInfo(); String pathInfo = request.getPathInfo();

View File

@ -24,6 +24,7 @@ import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.util.UrlPathHelper;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -38,6 +39,14 @@ public class AntPathRequestMatcherTests {
@Mock @Mock
private HttpServletRequest request; private HttpServletRequest request;
@Test
public void matchesWhenUrlPathHelperThenMatchesOnRequestUri() {
AntPathRequestMatcher matcher = new AntPathRequestMatcher("/foo/bar", null, true, new UrlPathHelper());
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/foo/bar");
assertThat(matcher.matches(request)).isTrue();
}
@Test @Test
public void singleWildcardMatchesAnyPath() { public void singleWildcardMatchesAnyPath() {
AntPathRequestMatcher matcher = new AntPathRequestMatcher("/**"); AntPathRequestMatcher matcher = new AntPathRequestMatcher("/**");