From f1653cc21c09ebab136f84ee723bdf3c23965dde Mon Sep 17 00:00:00 2001 From: Andy Clement Date: Fri, 17 Feb 2017 17:37:12 -0800 Subject: [PATCH] Fix PathPattern incorrectly matching variable against root path Issue: SPR-15264 --- .../patterns/CaptureVariablePathElement.java | 3 ++- .../patterns/PathPatternMatcherTests.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/spring-web/src/main/java/org/springframework/web/util/patterns/CaptureVariablePathElement.java b/spring-web/src/main/java/org/springframework/web/util/patterns/CaptureVariablePathElement.java index b2e04ad7d06..0a0cb08e66c 100644 --- a/spring-web/src/main/java/org/springframework/web/util/patterns/CaptureVariablePathElement.java +++ b/spring-web/src/main/java/org/springframework/web/util/patterns/CaptureVariablePathElement.java @@ -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) { diff --git a/spring-web/src/test/java/org/springframework/web/util/patterns/PathPatternMatcherTests.java b/spring-web/src/test/java/org/springframework/web/util/patterns/PathPatternMatcherTests.java index af1870fe0e5..674d5aba9b8 100644 --- a/spring-web/src/test/java/org/springframework/web/util/patterns/PathPatternMatcherTests.java +++ b/spring-web/src/test/java/org/springframework/web/util/patterns/PathPatternMatcherTests.java @@ -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");