Treat null path as non-matching pattern in AntPathMatcher
Prior to this commit, a null path supplied to the isPattern(), match(), and matchStart() methods in AntPathMatcher resulted in a NullPointerException. This commit addresses this by treating a `null` path as a non-matching pattern. Closes gh-23297
This commit is contained in:
parent
639a254e0d
commit
84200f3141
|
|
@ -169,6 +169,9 @@ public class AntPathMatcher implements PathMatcher {
|
|||
|
||||
@Override
|
||||
public boolean isPattern(String path) {
|
||||
if(path == null) {
|
||||
return false;
|
||||
}
|
||||
boolean uriVar = false;
|
||||
for (int i = 0; i < path.length(); i++) {
|
||||
char c = path.charAt(i);
|
||||
|
|
@ -207,7 +210,7 @@ public class AntPathMatcher implements PathMatcher {
|
|||
protected boolean doMatch(String pattern, String path, boolean fullMatch,
|
||||
@Nullable Map<String, String> uriTemplateVariables) {
|
||||
|
||||
if (path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
|
||||
if (path == null || path.startsWith(this.pathSeparator) != pattern.startsWith(this.pathSeparator)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -130,6 +130,11 @@ public class AntPathMatcherTests {
|
|||
assertThat(pathMatcher.match("", "")).isTrue();
|
||||
|
||||
assertThat(pathMatcher.match("/{bla}.*", "/testing.html")).isTrue();
|
||||
|
||||
assertThat(pathMatcher.match("/test", null)).isFalse();
|
||||
assertThat(pathMatcher.match("/", null)).isFalse();
|
||||
assertThat(pathMatcher.match("/", null)).isFalse();
|
||||
assertThat(pathMatcher.match(null, null)).isFalse();
|
||||
}
|
||||
|
||||
// SPR-14247
|
||||
|
|
@ -688,6 +693,7 @@ public class AntPathMatcherTests {
|
|||
assertThat(pathMatcher.isPattern("/test/{name}")).isTrue();
|
||||
assertThat(pathMatcher.isPattern("/test/name")).isFalse();
|
||||
assertThat(pathMatcher.isPattern("/test/foo{bar")).isFalse();
|
||||
assertThat(pathMatcher.isPattern(null)).isFalse();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,18 @@ public class MockMvcResultMatchersTests {
|
|||
redirectedUrl("/resource/1").match(getRedirectedUrlStubMvcResult("/resource/1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void redirectNonMatching() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
redirectedUrl("/resource/2").match(getRedirectedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void redirectNonMatchingBecauseNotRedirect() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
redirectedUrl("/resource/1").match(getForwardedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void redirectWithUrlTemplate() throws Exception {
|
||||
redirectedUrlTemplate("/orders/{orderId}/items/{itemId}", 1, 2).match(getRedirectedUrlStubMvcResult("/orders/1/items/2"));
|
||||
|
|
@ -58,11 +70,29 @@ public class MockMvcResultMatchersTests {
|
|||
redirectedUrlPattern("/resource/").match(getRedirectedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void redirectWithNonMatchingPatternBecauseNotRedirect() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
redirectedUrlPattern("/resource/*").match(getForwardedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forward() throws Exception {
|
||||
forwardedUrl("/api/resource/1").match(getForwardedUrlStubMvcResult("/api/resource/1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forwardNonMatching() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
forwardedUrlPattern("api/resource/2").match(getForwardedUrlStubMvcResult("api/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forwardNonMatchingBecauseNotForward() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
forwardedUrlPattern("api/resource/1").match(getRedirectedUrlStubMvcResult("api/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forwardWithQueryString() throws Exception {
|
||||
forwardedUrl("/api/resource/1?arg=value").match(getForwardedUrlStubMvcResult("/api/resource/1?arg=value"));
|
||||
|
|
@ -84,6 +114,12 @@ public class MockMvcResultMatchersTests {
|
|||
forwardedUrlPattern("/resource/").match(getForwardedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void forwardWithNonMatchingPatternBecauseNotForward() {
|
||||
assertThatExceptionOfType(AssertionError.class).isThrownBy(() ->
|
||||
forwardedUrlPattern("/resource/*").match(getRedirectedUrlStubMvcResult("/resource/1")));
|
||||
}
|
||||
|
||||
private StubMvcResult getRedirectedUrlStubMvcResult(String redirectUrl) throws Exception {
|
||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
||||
response.sendRedirect(redirectUrl);
|
||||
|
|
|
|||
Loading…
Reference in New Issue