Skip to content

Commit

Permalink
Fix path within mapping when pattern contains ".*"
Browse files Browse the repository at this point in the history
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.

See gh-29712
Fixes gh-29716
  • Loading branch information
bclozel committed Dec 19, 2022
1 parent f8fea01 commit 777f01d
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,10 @@ public char[] getChars() {
return this.text;
}

@Override
public boolean isLiteral() {
return true;
}

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
* Common supertype for the Ast nodes created to represent a path pattern.
*
* @author Andy Clement
* @author Brian Clozel
* @since 5.0
*/
abstract class PathElement {
Expand Down Expand Up @@ -99,6 +100,14 @@ public int getScore() {
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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ public PathContainer extractPathWithinPattern(PathContainer path) {
// 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,10 @@ public char[] getChars() {
return new char[] {this.separator};
}

@Override
public boolean isLiteral() {
return true;
}

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,7 @@ public void extractPathWithinPattern() throws Exception {
checkExtractPathWithinPattern("/docs/commit.html", "/docs/commit.html", "");
checkExtractPathWithinPattern("/docs/*", "/docs/cvs/commit", "cvs/commit");
checkExtractPathWithinPattern("/docs/cvs/*.html", "/docs/cvs/commit.html", "commit.html");
checkExtractPathWithinPattern("/docs/cvs/file.*.html", "/docs/cvs/file.sha.html", "file.sha.html");
checkExtractPathWithinPattern("/docs/**", "/docs/cvs/commit", "cvs/commit");
checkExtractPathWithinPattern("/doo/{*foobar}", "/doo/customer.html", "customer.html");
checkExtractPathWithinPattern("/doo/{*foobar}", "/doo/daa/customer.html", "daa/customer.html");
Expand Down

0 comments on commit 777f01d

Please sign in to comment.