Browse Source

Consistently handle match with '*' and trailing slash

Prior to this commit, the `AntPathMatcher` would inconsistently match
pattern with trailing slashes if they contain `"**"` within their
pattern.

For example `"/en/test/"` would match `"/**/test"`, but it would not
match `"/*/test"` (as it should).

This commit fixes this behavior for better consistency.

Fixes gh-27506
pull/28303/head
Brian Clozel 3 years ago
parent
commit
705bf78104
  1. 4
      spring-core/src/main/java/org/springframework/util/AntPathMatcher.java
  2. 7
      spring-core/src/test/java/org/springframework/util/AntPathMatcherTests.java

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

@ -275,6 +275,10 @@ public class AntPathMatcher implements PathMatcher { @@ -275,6 +275,10 @@ public class AntPathMatcher implements PathMatcher {
if (!matchStrings(pattDir, pathDirs[pathIdxEnd], uriTemplateVariables)) {
return false;
}
if (pattIdxEnd == (pattDirs.length - 1)
&& pattern.endsWith(this.pathSeparator) != path.endsWith(this.pathSeparator)) {
return false;
}
pattIdxEnd--;
pathIdxEnd--;
}

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

@ -704,4 +704,11 @@ class AntPathMatcherTests { @@ -704,4 +704,11 @@ class AntPathMatcherTests {
assertThat(pathMatcher.isPattern(null)).isFalse();
}
@Test // gh-27506
void consistentMatchWithWildcardsAndTrailingSlash() {
assertThat(pathMatcher.match("/*/foo", "/en/foo")).isTrue();
assertThat(pathMatcher.match("/*/foo", "/en/foo/")).isFalse();
assertThat(pathMatcher.match("/**/foo", "/en/foo")).isTrue();
assertThat(pathMatcher.match("/**/foo", "/en/foo/")).isFalse();
}
}

Loading…
Cancel
Save