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:
parent
5f4eb4dd55
commit
d293889bb3
|
@ -376,30 +376,22 @@ public class AntPathMatcher implements PathMatcher {
|
|||
public String extractPathWithinPattern(String pattern, String path) {
|
||||
String[] patternParts = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator, this.trimTokens, true);
|
||||
String[] pathParts = StringUtils.tokenizeToStringArray(path, this.pathSeparator, this.trimTokens, true);
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
boolean pathStarted = false;
|
||||
|
||||
// Add any path parts that have a wildcarded pattern part.
|
||||
int puts = 0;
|
||||
for (int i = 0; i < patternParts.length; i++) {
|
||||
String patternPart = patternParts[i];
|
||||
if ((patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) && pathParts.length >= i + 1) {
|
||||
if (puts > 0 || (i == 0 && !pattern.startsWith(this.pathSeparator))) {
|
||||
builder.append(this.pathSeparator);
|
||||
for (int segment = 0; segment < patternParts.length; segment++) {
|
||||
String patternPart = patternParts[segment];
|
||||
if (patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) {
|
||||
for (; segment < pathParts.length; segment++) {
|
||||
if (pathStarted || (segment == 0 && !pattern.startsWith(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();
|
||||
}
|
||||
|
||||
|
|
|
@ -294,6 +294,10 @@ public class AntPathMatcherTests {
|
|||
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"));
|
||||
//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("cvs/commit.html",
|
||||
|
|
Loading…
Reference in New Issue