Fix invalid PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE

Prior to this commit, `AntPathMatcher.extractPathWithinPattern` would
not process correctly `**` patterns and would only match *one* path
segment in the given path.

This commit changes `extractPathWithinPattern` to allow multiple path
segments to be matched against a single `**` pattern segment.

Issue: SPR-10515
This commit is contained in:
Brian Clozel 2014-09-30 14:03:27 +02:00
parent 5f4eb4dd55
commit d293889bb3
2 changed files with 14 additions and 18 deletions

View File

@ -376,30 +376,22 @@ public class AntPathMatcher implements PathMatcher {
public String extractPathWithinPattern(String pattern, String path) { public String extractPathWithinPattern(String pattern, String path) {
String[] patternParts = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator, this.trimTokens, true); String[] patternParts = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator, this.trimTokens, true);
String[] pathParts = StringUtils.tokenizeToStringArray(path, this.pathSeparator, this.trimTokens, true); String[] pathParts = StringUtils.tokenizeToStringArray(path, this.pathSeparator, this.trimTokens, true);
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
boolean pathStarted = false;
// Add any path parts that have a wildcarded pattern part. for (int segment = 0; segment < patternParts.length; segment++) {
int puts = 0; String patternPart = patternParts[segment];
for (int i = 0; i < patternParts.length; i++) { if (patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) {
String patternPart = patternParts[i]; for (; segment < pathParts.length; segment++) {
if ((patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) && pathParts.length >= i + 1) { if (pathStarted || (segment == 0 && !pattern.startsWith(this.pathSeparator))) {
if (puts > 0 || (i == 0 && !pattern.startsWith(this.pathSeparator))) { builder.append(this.pathSeparator);
builder.append(this.pathSeparator); }
builder.append(pathParts[segment]);
pathStarted = true;
} }
builder.append(pathParts[i]);
puts++;
} }
} }
// Append any trailing path parts.
for (int i = patternParts.length; i < pathParts.length; i++) {
if (puts > 0 || i > 0) {
builder.append(this.pathSeparator);
}
builder.append(pathParts[i]);
}
return builder.toString(); return builder.toString();
} }

View File

@ -294,6 +294,10 @@ public class AntPathMatcherTests {
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*.html", "/docs/commit.html")); assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*.html", "/docs/commit.html"));
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("**/*.*", "/docs/commit.html")); assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("**/*.*", "/docs/commit.html"));
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*", "/docs/commit.html")); assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*", "/docs/commit.html"));
//SPR-10515
assertEquals("/docs/cvs/other/commit.html", pathMatcher.extractPathWithinPattern("**/commit.html", "/docs/cvs/other/commit.html"));
assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/commit.html", "/docs/cvs/other/commit.html"));
assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/**/**/**", "/docs/cvs/other/commit.html"));
assertEquals("docs/cvs/commit", pathMatcher.extractPathWithinPattern("/d?cs/*", "/docs/cvs/commit")); assertEquals("docs/cvs/commit", pathMatcher.extractPathWithinPattern("/d?cs/*", "/docs/cvs/commit"));
assertEquals("cvs/commit.html", assertEquals("cvs/commit.html",