From 139e3c43da05b2df777146e1c1eb523b3029c74d Mon Sep 17 00:00:00 2001 From: PJ Dietz Date: Mon, 25 May 2015 10:17:42 -0400 Subject: [PATCH] Template Routes do not match slash prefix variables that contain slashes as the non-first character --- src/Routing/Route/TemplateRoute.php | 11 ++++++++--- test/tests/unit/Routing/Route/TemplateRouteTest.php | 7 ++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Routing/Route/TemplateRoute.php b/src/Routing/Route/TemplateRoute.php index ea0019a..3649633 100644 --- a/src/Routing/Route/TemplateRoute.php +++ b/src/Routing/Route/TemplateRoute.php @@ -125,6 +125,9 @@ class TemplateRoute extends Route // characters to allow in the match. $operator = $name[0]; + // Read the last character as the modifier. + $explosion = (substr($name, -1, 1) === "*"); + switch ($operator) { case "+": $name = substr($name, 1); @@ -138,15 +141,17 @@ class TemplateRoute extends Route break; case "/": $name = substr($name, 1); - $pattern = '[0-9a-zA-Z\-._\~%,\/]*'; // Unreserved + "," and "/" $prefix = "\\/"; $delimiter = "\\/"; - $explodeDelimiter = "/"; + if ($explosion) { + $pattern = '[0-9a-zA-Z\-._\~%,\/]*'; // Unreserved + "," and "/" + $explodeDelimiter = "/"; + } break; } // Explosion - if (substr($name, -1, 1) === "*") { + if ($explosion) { $name = substr($name, 0, -1); if ($pattern === self::RE_UNRESERVED) { $pattern = '[0-9a-zA-Z\-._\~%,]*'; // Unreserved + "," diff --git a/test/tests/unit/Routing/Route/TemplateRouteTest.php b/test/tests/unit/Routing/Route/TemplateRouteTest.php index cb0785e..f441936 100644 --- a/test/tests/unit/Routing/Route/TemplateRouteTest.php +++ b/test/tests/unit/Routing/Route/TemplateRouteTest.php @@ -78,9 +78,10 @@ class TemplateRouteTest extends \PHPUnit_Framework_TestCase public function nonMatchingTargetProvider() { return [ - ["/foo/{var}", "/bar/12", false, "Mismatch before first template expression"], - ["/foo/{foo}/bar/{bar}", "/foo/12/13", false, "Mismatch after first template expression"], - ["/hello/{hello}", "/hello/Hello%20World!", false, "Requires + operator to match reserver characters"] + ["/foo/{var}", "/bar/12", "Mismatch before first template expression"], + ["/foo/{foo}/bar/{bar}", "/foo/12/13", "Mismatch after first template expression"], + ["/hello/{hello}", "/hello/Hello%20World!", "Requires + operator to match reserver characters"], + ["{/var}", "/bar/12", "Path contains more segements than template"], ]; }