Skip to content

Commit 57f7b14

Browse files
Antonio MarreroPhillip Webb
Antonio Marrero
authored and
Phillip Webb
committed
Assign lowest priority to /** pattern
Update AntPathMatcher Comparator to treat `/**` in the same way as `null` paths. Prior to this commit the pattern `/**` would be picked in preference to patterns with 3 or more PathVariable (e.g. `/matches/{matchId}/ periods/{periodId}/teams/{teamId}/results`). Issue: SPR-10550
1 parent c1dafed commit 57f7b14

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -391,15 +391,16 @@ private AntPatternComparator(String path) {
391391

392392
@Override
393393
public int compare(String pattern1, String pattern2) {
394-
if (pattern1 == null && pattern2 == null) {
394+
if (isNullOrCaptureAllPattern(pattern1) && isNullOrCaptureAllPattern(pattern2)) {
395395
return 0;
396396
}
397-
else if (pattern1 == null) {
397+
else if (isNullOrCaptureAllPattern(pattern1)) {
398398
return 1;
399399
}
400-
else if (pattern2 == null) {
400+
else if (isNullOrCaptureAllPattern(pattern2)) {
401401
return -1;
402402
}
403+
403404
boolean pattern1EqualsPath = pattern1.equals(path);
404405
boolean pattern2EqualsPath = pattern2.equals(path);
405406
if (pattern1EqualsPath && pattern2EqualsPath) {
@@ -411,6 +412,7 @@ else if (pattern1EqualsPath) {
411412
else if (pattern2EqualsPath) {
412413
return 1;
413414
}
415+
414416
int wildCardCount1 = getWildCardCount(pattern1);
415417
int wildCardCount2 = getWildCardCount(pattern2);
416418

@@ -448,6 +450,10 @@ else if (bracketCount2 < bracketCount1) {
448450
return 0;
449451
}
450452

453+
private boolean isNullOrCaptureAllPattern(String pattern) {
454+
return pattern == null || "/**".equals(pattern);
455+
}
456+
451457
private int getWildCardCount(String pattern) {
452458
if (pattern.endsWith(".*")) {
453459
pattern = pattern.substring(0, pattern.length() - 2);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,11 @@ public void patternComparator() {
437437
assertEquals(-1, comparator.compare("/hotels/{hotel}/booking", "/hotels/{hotel}/bookings/{booking}"));
438438
assertEquals(1, comparator.compare("/hotels/{hotel}/bookings/{booking}", "/hotels/{hotel}/booking"));
439439

440+
//SPR-10550
441+
assertEquals(-1, comparator.compare("/hotels/{hotel}/bookings/{booking}/cutomers/{customer}", "/**"));
442+
assertEquals(1, comparator.compare("/**","/hotels/{hotel}/bookings/{booking}/cutomers/{customer}"));
443+
assertEquals(0, comparator.compare("/**","/**"));
444+
440445
assertEquals(-1, comparator.compare("/hotels/{hotel}", "/hotels/*"));
441446
assertEquals(1, comparator.compare("/hotels/*", "/hotels/{hotel}"));
442447

0 commit comments

Comments
 (0)