Fix path within mapping when pattern contains ".*"

Prior to this commit, extracting the path within handler mapping would
result in "" if the matching path element would be a Regex and contain
".*". This could cause issues with resource handling if the handler
mapping pattern was similar to `"/folder/file.*.extension"`.

This commit introduces a new `isLiteral()` method in the `PathElement`
abstract class that expresses whether the path element can be compared
as a String for path matching or if it requires a more elaborate
matching process.

Using this method for extracting the path within handler mapping avoids
relying on wildcard count or other properties.

Fixes gh-29712
This commit is contained in:
Brian Clozel
2022-12-19 10:15:39 +01:00
parent b71db12c43
commit 5366ac84e6
5 changed files with 19 additions and 1 deletions

View File

@@ -118,6 +118,10 @@ class LiteralPathElement extends PathElement {
return this.text;
}
@Override
public boolean isLiteral() {
return true;
}
@Override
public String toString() {

View File

@@ -25,6 +25,7 @@ import org.springframework.web.util.pattern.PathPattern.MatchingContext;
* Common supertype for the Ast nodes created to represent a path pattern.
*
* @author Andy Clement
* @author Brian Clozel
* @since 5.0
*/
abstract class PathElement {
@@ -99,6 +100,14 @@ abstract class PathElement {
return 0;
}
/**
* Return whether this PathElement can be strictly {@link String#compareTo(String) compared}
* against another element for matching.
*/
public boolean isLiteral() {
return false;
}
/**
* Return if the there are no more PathElements in the pattern.
* @return {@code true} if the there are no more elements

View File

@@ -304,7 +304,7 @@ public class PathPattern implements Comparable<PathPattern> {
// Find first path element that is not a separator or a literal (i.e. the first pattern based element)
PathElement elem = this.head;
while (elem != null) {
if (elem.getWildcardCount() != 0 || elem.getCaptureCount() != 0) {
if (!elem.isLiteral()) {
break;
}
elem = elem.next;

View File

@@ -67,6 +67,10 @@ class SeparatorPathElement extends PathElement {
return new char[] {this.separator};
}
@Override
public boolean isLiteral() {
return true;
}
@Override
public String toString() {