Fix PathPattern incorrectly matching variable against root path

Issue: SPR-15264
This commit is contained in:
Andy Clement 2017-02-17 17:37:12 -08:00
parent 45df1d9fea
commit f1653cc21c
2 changed files with 27 additions and 1 deletions

View File

@ -80,7 +80,8 @@ class CaptureVariablePathElement extends PathElement {
}
boolean match = false;
if (next == null) {
match = (nextPos == matchingContext.candidateLength);
// Needs to be at least one character #SPR15264
match = (nextPos == matchingContext.candidateLength && nextPos > candidateIndex);
}
else {
if (matchingContext.isMatchStartMatching && nextPos == matchingContext.candidateLength) {

View File

@ -507,6 +507,31 @@ public class PathPatternMatcherTests {
checkExtractPathWithinPattern("/", "//", "");
}
@Test
public void extractUriTemplateVariables_spr15264() {
PathPattern pp = new PathPatternParser().parse("/{foo}");
assertTrue(pp.matches("/abc"));
assertFalse(pp.matches("/"));
assertFalse(pp.matches("//"));
checkCapture("/{foo}", "/abc", "foo", "abc");
pp = new PathPatternParser().parse("/{foo}/{bar}");
assertTrue(pp.matches("/abc/def"));
assertFalse(pp.matches("//def"));
assertFalse(pp.matches("//"));
pp = parse("/{foo}/boo");
assertTrue(pp.matches("/abc/boo"));
assertTrue(pp.matches("/a/boo"));
assertFalse(pp.matches("//boo"));
checkCapture("/{word:[a-z]*}", "/abc", "word", "abc");
pp = parse("/{word:[a-z]*}");
assertFalse(pp.matches("/1"));
assertTrue(pp.matches("/a"));
assertFalse(pp.matches("/"));
}
@Test
public void extractUriTemplateVariables() throws Exception {
checkCapture("/hotels/{hotel}", "/hotels/1", "hotel", "1");