From 2bb8890bbb648c82a887563bbb2572f01483d748 Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Tue, 29 Jan 2019 08:59:09 +0100 Subject: [PATCH] [Routing] dont redirect routes with greedy trailing vars with no explicit slash --- .../Matcher/Dumper/PhpMatcherDumper.php | 44 +++----------- .../Component/Routing/Matcher/UrlMatcher.php | 19 +++--- .../Tests/Fixtures/dumper/url_matcher1.php | 33 +++-------- .../Tests/Fixtures/dumper/url_matcher10.php | 15 ++--- .../Tests/Fixtures/dumper/url_matcher11.php | 17 ++---- .../Tests/Fixtures/dumper/url_matcher12.php | 15 ++--- .../Tests/Fixtures/dumper/url_matcher13.php | 12 +--- .../Tests/Fixtures/dumper/url_matcher2.php | 59 ++++--------------- .../Tests/Fixtures/dumper/url_matcher3.php | 15 ++--- .../Tests/Fixtures/dumper/url_matcher5.php | 17 ++---- .../Tests/Fixtures/dumper/url_matcher6.php | 15 ++--- .../Tests/Fixtures/dumper/url_matcher7.php | 17 ++---- .../Tests/Fixtures/dumper/url_matcher8.php | 15 ++--- 13 files changed, 80 insertions(+), 213 deletions(-) diff --git a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php index ce6baef939..9d1d590e6c 100644 --- a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php +++ b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php @@ -558,34 +558,27 @@ EOF; $code = ''; } - $code .= $hasVars ? ' - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - }' : ' - break;'; - $code = sprintf(<<<'EOF' - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s + if ('/' !== $pathinfo && %s$hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s + break; } EOF , + $hasVars ? '!$hasTrailingVar && ' : '', $code ); if ($hasVars) { $code = <<<'EOF' - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; EOF .$code.<<<'EOF' + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; + } foreach ($vars as $i => $v) { if (isset($matches[1 + $i])) { @@ -665,31 +658,10 @@ EOF if ('/' !== $pathinfo && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { $matches = $n; } -EOF; - } elseif ($this->supportsRedirections && (!$methods || isset($methods['GET']))) { - $code .= <<<'EOF' - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) {%s - if ($trimmedPathinfo === $pathinfo) { - goto %s; - } - } EOF; } else { $code .= <<<'EOF' - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto %2$s; } EOF; diff --git a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php index 5827c90535..7329abdcd7 100644 --- a/src/Symfony/Component/Routing/Matcher/UrlMatcher.php +++ b/src/Symfony/Component/Routing/Matcher/UrlMatcher.php @@ -156,21 +156,18 @@ class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface continue; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar = preg_match('#\{\w+\}/?$#', $route->getPath())) { - // no-op - } elseif (preg_match($regex, $trimmedPathinfo, $m)) { - $matches = $m; - } else { - $hasTrailingSlash = true; - } + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && preg_match('#\{\w+\}/?$#', $route->getPath()); - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ($supportsTrailingSlash && (!$requiredMethods || \in_array('GET', $requiredMethods))) { return $this->allow = $this->allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - continue; - } + + continue; + } + + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, $trimmedPathinfo, $m)) { + $matches = $m; } $hostMatches = []; diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php index 43264ca134..8f73a63a2c 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php @@ -187,11 +187,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher break; case 160: // foo1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo1; } @@ -209,11 +205,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher break; case 204: // foo2 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo2; } @@ -225,11 +217,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher break; case 279: // foo3 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo3; } @@ -262,17 +250,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php index c2547956fd..abec42c0b7 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher10.php @@ -2794,17 +2794,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php index 1a4f549d09..325af4b709 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher11.php @@ -119,20 +119,15 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php index 5ffc0c1b48..1fb5f9097f 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher12.php @@ -64,17 +64,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php index e4b78e01db..7ef8270957 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher13.php @@ -44,11 +44,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher switch ($m = (int) $matches['MARK']) { case 56: // r1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_r1; } @@ -58,11 +54,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher not_r1: // r2 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_r2; } diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php index 3426b358cb..b7e03db8ac 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php @@ -230,11 +230,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec break; case 160: // foo1 - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } elseif ('/' !== $pathinfo) { + if ($trimmedPathinfo !== $pathinfo) { goto not_foo1; } @@ -252,22 +248,8 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec break; case 204: // foo2 - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ('GET' === $canonicalMethod) { - return $allow = $allowSchemes = []; - } - if ($trimmedPathinfo === $pathinfo) { - goto not_foo2; - } + if ($trimmedPathinfo !== $pathinfo) { + goto not_foo2; } $matches = ['foo1' => $matches[1] ?? null]; @@ -278,22 +260,8 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec break; case 279: // foo3 - $hasTrailingSlash = false; - if ($trimmedPathinfo === $pathinfo) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ('GET' === $canonicalMethod) { - return $allow = $allowSchemes = []; - } - if ($trimmedPathinfo === $pathinfo) { - goto not_foo3; - } + if ($trimmedPathinfo !== $pathinfo) { + goto not_foo3; } $matches = ['_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null]; @@ -325,20 +293,15 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php index fa0549606b..5f2239fede 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher3.php @@ -84,17 +84,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php index 4bd4b08f5f..21190f42d0 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher5.php @@ -124,20 +124,15 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php index caa2e3e220..33b76f7527 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher6.php @@ -98,17 +98,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php index 2c0b58b106..acf2a190a7 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher7.php @@ -136,20 +136,15 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; - } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { if ('GET' === $canonicalMethod && (!$requiredMethods || isset($requiredMethods['GET']))) { return $allow = $allowSchemes = []; } - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + break; + } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) { diff --git a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php index edbbb29cef..ebdbc5ccb5 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher8.php @@ -52,17 +52,12 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher list($ret, $vars, $requiredMethods, $requiredSchemes, $hasTrailingSlash, $hasTrailingVar) = $routes[$m]; - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - // no-op - } elseif (preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { - $matches = $n; - } else { - $hasTrailingSlash = true; + $hasTrailingVar = $trimmedPathinfo !== $pathinfo && $hasTrailingVar; + if ('/' !== $pathinfo && !$hasTrailingVar && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { + break; } - if ('/' !== $pathinfo && $hasTrailingSlash === ($trimmedPathinfo === $pathinfo)) { - if ($trimmedPathinfo === $pathinfo || !$hasTrailingVar) { - break; - } + if ($hasTrailingSlash && $hasTrailingVar && preg_match($regex, rtrim($matchedPathinfo, '/') ?: '/', $n) && $m === (int) $n['MARK']) { + $matches = $n; } foreach ($vars as $i => $v) {