Skip to content

Commit

Permalink
Fix AntPathMatcher multiple segments matching
Browse files Browse the repository at this point in the history
Prior to this commit, the new match algorithm wouldn't work for multiple
consecutive path separators.
This commit separately matches path segments and path separators and
allows for multiple, consecutive path separators.

Issue: SPR-14141
  • Loading branch information
bclozel committed Apr 15, 2016
1 parent e38bfb1 commit 368f29d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 14 deletions.
Expand Up @@ -317,34 +317,42 @@ private boolean isPotentialMatch(String path, String[] pattDirs) {
char[] pathChars = path.toCharArray();
int pos = 0;
for (String pattDir : pattDirs) {
int count = countStartsWith(pathChars, pos, this.pathSeparator, false);
pos += (count == this.pathSeparator.length() ? count : 0);
count = countStartsWith(pathChars, pos, pattDir, true);
if (count < pattDir.length()) {
if (count > 0) {
int skipped = skipSeparator(path, pos, this.pathSeparator);
pos += skipped;
skipped = skipSegment(pathChars, pos, pattDir);
if (skipped < pattDir.length()) {
if (skipped > 0) {
return true;
}
return (pattDir.length() > 0) && isWildcardChar(pattDir.charAt(0));
}
pos += count;
pos += skipped;
}
return true;
}

private int countStartsWith(char[] chars, int pos, String prefix, boolean stopOnWildcard) {
int count = 0;
private int skipSegment(char[] chars, int pos, String prefix) {
int skipped = 0;
for (char c : prefix.toCharArray()) {
if (stopOnWildcard && isWildcardChar(c)) {
return count;
if (isWildcardChar(c)) {
return skipped;
}
if (pos + count >= chars.length) {
else if (pos + skipped >= chars.length) {
return 0;
}
if (chars[pos + count] == c) {
count++;
else if (chars[pos + skipped] == c) {
skipped++;
}
}
return count;
return skipped;
}

private int skipSeparator(String path, int pos, String separator) {
int skipped = 0;
while (path.startsWith(separator, pos + skipped)) {
skipped += separator.length();
}
return skipped;
}

private boolean isWildcardChar(char c) {
Expand Down
Expand Up @@ -53,6 +53,7 @@ public void match() {
// test exact matching
assertTrue(pathMatcher.match("test", "test"));
assertTrue(pathMatcher.match("/test", "/test"));
assertTrue(pathMatcher.match("http://example.org", "http://example.org")); // SPR-14141
assertFalse(pathMatcher.match("/test.jpg", "test.jpg"));
assertFalse(pathMatcher.match("test", "/test"));
assertFalse(pathMatcher.match("/test", "test"));
Expand Down

0 comments on commit 368f29d

Please sign in to comment.