Browse Source

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
pull/23315/head
Scheidter,Ryan 5 years ago committed by Sam Brannen
parent
commit
84200f3141
  1. 5
      spring-core/src/main/java/org/springframework/util/AntPathMatcher.java
  2. 6
      spring-core/src/test/java/org/springframework/util/AntPathMatcherTests.java
  3. 36
      spring-test/src/test/java/org/springframework/test/web/servlet/result/MockMvcResultMatchersTests.java

5
spring-core/src/main/java/org/springframework/util/AntPathMatcher.java

@ -169,6 +169,9 @@ public class AntPathMatcher implements PathMatcher { @@ -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 { @@ -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;
}

6
spring-core/src/test/java/org/springframework/util/AntPathMatcherTests.java

@ -130,6 +130,11 @@ public class AntPathMatcherTests { @@ -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 { @@ -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();
}
}

36
spring-test/src/test/java/org/springframework/test/web/servlet/result/MockMvcResultMatchersTests.java

@ -42,6 +42,18 @@ public class MockMvcResultMatchersTests { @@ -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 { @@ -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 { @@ -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…
Cancel
Save