Skip to content

Commit d293889

Browse files
committed
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
1 parent 5f4eb4d commit d293889

File tree

2 files changed

+15
-19
lines changed

2 files changed

+15
-19
lines changed

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

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -376,28 +376,20 @@ protected AntPathStringMatcher getStringMatcher(String pattern) {
376376
public String extractPathWithinPattern(String pattern, String path) {
377377
String[] patternParts = StringUtils.tokenizeToStringArray(pattern, this.pathSeparator, this.trimTokens, true);
378378
String[] pathParts = StringUtils.tokenizeToStringArray(path, this.pathSeparator, this.trimTokens, true);
379-
380379
StringBuilder builder = new StringBuilder();
381-
382-
// Add any path parts that have a wildcarded pattern part.
383-
int puts = 0;
384-
for (int i = 0; i < patternParts.length; i++) {
385-
String patternPart = patternParts[i];
386-
if ((patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) && pathParts.length >= i + 1) {
387-
if (puts > 0 || (i == 0 && !pattern.startsWith(this.pathSeparator))) {
388-
builder.append(this.pathSeparator);
380+
boolean pathStarted = false;
381+
382+
for (int segment = 0; segment < patternParts.length; segment++) {
383+
String patternPart = patternParts[segment];
384+
if (patternPart.indexOf('*') > -1 || patternPart.indexOf('?') > -1) {
385+
for (; segment < pathParts.length; segment++) {
386+
if (pathStarted || (segment == 0 && !pattern.startsWith(this.pathSeparator))) {
387+
builder.append(this.pathSeparator);
388+
}
389+
builder.append(pathParts[segment]);
390+
pathStarted = true;
389391
}
390-
builder.append(pathParts[i]);
391-
puts++;
392-
}
393-
}
394-
395-
// Append any trailing path parts.
396-
for (int i = patternParts.length; i < pathParts.length; i++) {
397-
if (puts > 0 || i > 0) {
398-
builder.append(this.pathSeparator);
399392
}
400-
builder.append(pathParts[i]);
401393
}
402394

403395
return builder.toString();

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,10 @@ public void extractPathWithinPattern() throws Exception {
294294
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*.html", "/docs/commit.html"));
295295
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("**/*.*", "/docs/commit.html"));
296296
assertEquals("/docs/commit.html", pathMatcher.extractPathWithinPattern("*", "/docs/commit.html"));
297+
//SPR-10515
298+
assertEquals("/docs/cvs/other/commit.html", pathMatcher.extractPathWithinPattern("**/commit.html", "/docs/cvs/other/commit.html"));
299+
assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/commit.html", "/docs/cvs/other/commit.html"));
300+
assertEquals("cvs/other/commit.html", pathMatcher.extractPathWithinPattern("/docs/**/**/**/**", "/docs/cvs/other/commit.html"));
297301

298302
assertEquals("docs/cvs/commit", pathMatcher.extractPathWithinPattern("/d?cs/*", "/docs/cvs/commit"));
299303
assertEquals("cvs/commit.html",

0 commit comments

Comments
 (0)