diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/SessionController.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/SessionController.php index a1d91e7929..0c82d8cc73 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/SessionController.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/SessionController.php @@ -43,6 +43,14 @@ class SessionController implements ContainerAwareInterface return new Response(sprintf('Welcome back %s, nice to meet you.', $name)); } + public function cacheableAction() + { + $response = new Response('all good'); + $response->setSharedMaxAge(100); + + return $response; + } + public function logoutAction(Request $request) { $request->getSession()->invalidate(); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Resources/config/routing.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Resources/config/routing.yml index 0730b72328..3cbdf944af 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Resources/config/routing.yml +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Resources/config/routing.yml @@ -2,6 +2,10 @@ session_welcome: path: /session defaults: { _controller: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SessionController::welcomeAction } +session_cacheable: + path: /cacheable + defaults: { _controller: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SessionController::cacheableAction } + session_welcome_name: path: /session/{name} defaults: { _controller: Symfony\Bundle\FrameworkBundle\Tests\Functional\Bundle\TestBundle\Controller\SessionController::welcomeAction } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SessionTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SessionTest.php index 166d8a3391..2e1634220c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SessionTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SessionTest.php @@ -126,6 +126,22 @@ class SessionTest extends WebTestCase $this->assertContains('Welcome back client2, nice to meet you.', $crawler2->text()); } + /** + * @dataProvider getConfigs + */ + public function testCorrectCacheControlHeadersForCacheableAction($config, $insulate) + { + $client = $this->createClient(array('test_case' => 'Session', 'root_config' => $config)); + if ($insulate) { + $client->insulate(); + } + + $client->request('GET', '/cacheable'); + + $response = $client->getResponse(); + $this->assertSame('public, s-maxage=100', $response->headers->get('cache-control')); + } + public function getConfigs() { return array( diff --git a/src/Symfony/Component/HttpFoundation/Session/Session.php b/src/Symfony/Component/HttpFoundation/Session/Session.php index f0379c1697..c0978d552f 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Session.php +++ b/src/Symfony/Component/HttpFoundation/Session/Session.php @@ -54,8 +54,6 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable */ public function start() { - ++$this->usageIndex; - return $this->storage->start(); } @@ -160,7 +158,9 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable */ public function isEmpty() { - ++$this->usageIndex; + if ($this->isStarted()) { + ++$this->usageIndex; + } foreach ($this->data as &$data) { if (!empty($data)) { return false; @@ -185,8 +185,6 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable */ public function migrate($destroy = false, $lifetime = null) { - ++$this->usageIndex; - return $this->storage->regenerate($destroy, $lifetime); } @@ -195,8 +193,6 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable */ public function save() { - ++$this->usageIndex; - $this->storage->save(); } diff --git a/src/Symfony/Component/HttpFoundation/Session/SessionBagProxy.php b/src/Symfony/Component/HttpFoundation/Session/SessionBagProxy.php index 88005ee092..3504bdfe7b 100644 --- a/src/Symfony/Component/HttpFoundation/Session/SessionBagProxy.php +++ b/src/Symfony/Component/HttpFoundation/Session/SessionBagProxy.php @@ -44,6 +44,9 @@ final class SessionBagProxy implements SessionBagInterface */ public function isEmpty() { + if (!isset($this->data[$this->bag->getStorageKey()])) { + return true; + } ++$this->usageIndex; return empty($this->data[$this->bag->getStorageKey()]); @@ -81,8 +84,6 @@ final class SessionBagProxy implements SessionBagInterface */ public function clear() { - ++$this->usageIndex; - return $this->bag->clear(); } } diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php index 59242ef387..bad59332a9 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Handler/RedisSessionHandler.php @@ -12,6 +12,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler; use Predis\Response\ErrorInterface; +use Symfony\Component\Cache\Traits\RedisProxy; /** * Redis based session storage handler based on the Redis class diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php index 12e32df36a..bfe13f05ed 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php @@ -407,8 +407,6 @@ class NativeSessionStorage implements SessionStorageInterface } if ($this->saveHandler instanceof SessionHandlerProxy) { - session_set_save_handler($this->saveHandler->getHandler(), false); - } elseif ($this->saveHandler instanceof \SessionHandlerInterface) { session_set_save_handler($this->saveHandler, false); } } diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php b/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php index 53c1209a1c..b11cc397a0 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/Proxy/SessionHandlerProxy.php @@ -14,7 +14,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy; /** * @author Drak */ -class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface +class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface { protected $handler; @@ -82,4 +82,20 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf { return (bool) $this->handler->gc($maxlifetime); } + + /** + * {@inheritdoc} + */ + public function validateId($sessionId) + { + return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId); + } + + /** + * {@inheritdoc} + */ + public function updateTimestamp($sessionId, $data) + { + return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data); + } } diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php index 682825356a..0b48250e01 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php @@ -121,4 +121,37 @@ class SessionHandlerProxyTest extends TestCase $this->proxy->gc(86400); } + + /** + * @requires PHPUnit 5.1 + */ + public function testValidateId() + { + $mock = $this->getMockBuilder(array('SessionHandlerInterface', 'SessionUpdateTimestampHandlerInterface'))->getMock(); + $mock->expects($this->once()) + ->method('validateId'); + + $proxy = new SessionHandlerProxy($mock); + $proxy->validateId('id'); + + $this->assertTrue($this->proxy->validateId('id')); + } + + /** + * @requires PHPUnit 5.1 + */ + public function testUpdateTimestamp() + { + $mock = $this->getMockBuilder(array('SessionHandlerInterface', 'SessionUpdateTimestampHandlerInterface'))->getMock(); + $mock->expects($this->once()) + ->method('updateTimestamp'); + + $proxy = new SessionHandlerProxy($mock); + $proxy->updateTimestamp('id', 'data'); + + $this->mock->expects($this->once()) + ->method('write'); + + $this->proxy->updateTimestamp('id', 'data'); + } } diff --git a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php index adb2b0a1c0..c5af8c52a3 100644 --- a/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php +++ b/src/Symfony/Component/Routing/Matcher/Dumper/PhpMatcherDumper.php @@ -379,7 +379,7 @@ EOF; $hostRegex = '(?i:'.preg_replace_callback('#\?P<([^>]++)>#', $state->getVars, $rx[1]).')\.'; $state->hostVars = $state->vars; } else { - $hostRegex = '(?:(?:[^.]*+\.)++)'; + $hostRegex = '(?:(?:[^./]*+\.)++)'; $state->hostVars = array(); } $state->mark += strlen($rx = ($prev ? ')' : '')."|{$hostRegex}(?"); @@ -746,6 +746,10 @@ EOF; return 'null'; } if (!\is_array($value)) { + if (\is_object($value)) { + throw new \InvalidArgumentException('Symfony\Component\Routing\Route cannot contain objects.'); + } + return str_replace("\n", '\'."\n".\'', var_export($value, true)); } if (!$value) { 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 b39bc7f2ba..c91066a46d 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher1.php @@ -82,47 +82,47 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher $matchedPathinfo = $host.'.'.$pathinfo; $regexList = array( 0 => '{^(?' - .'|(?:(?:[^.]*+\\.)++)(?' - .'|/foo/(baz|symfony)(*:46)' + .'|(?:(?:[^./]*+\\.)++)(?' + .'|/foo/(baz|symfony)(*:47)' .'|/bar(?' - .'|/([^/]++)(*:69)' - .'|head/([^/]++)(*:89)' + .'|/([^/]++)(*:70)' + .'|head/([^/]++)(*:90)' .')' .'|/test/([^/]++)/(?' - .'|(*:115)' + .'|(*:116)' .')' - .'|/([\']+)(*:131)' + .'|/([\']+)(*:132)' .'|/a/(?' .'|b\'b/([^/]++)(?' - .'|(*:160)' - .'|(*:168)' + .'|(*:161)' + .'|(*:169)' .')' - .'|(.*)(*:181)' + .'|(.*)(*:182)' .'|b\'b/([^/]++)(?' - .'|(*:204)' - .'|(*:212)' + .'|(*:205)' + .'|(*:213)' .')' .')' - .'|/multi/hello(?:/([^/]++))?(*:248)' + .'|/multi/hello(?:/([^/]++))?(*:249)' .'|/([^/]++)/b/([^/]++)(?' - .'|(*:279)' - .'|(*:287)' + .'|(*:280)' + .'|(*:288)' .')' - .'|/aba/([^/]++)(*:309)' + .'|/aba/([^/]++)(*:310)' .')|(?i:([^\\.]++)\\.example\\.com)\\.(?' .'|/route1(?' - .'|3/([^/]++)(*:371)' - .'|4/([^/]++)(*:389)' + .'|3/([^/]++)(*:372)' + .'|4/([^/]++)(*:390)' .')' .')|(?i:c\\.example\\.com)\\.(?' - .'|/route15/([^/]++)(*:441)' - .')|(?:(?:[^.]*+\\.)++)(?' - .'|/route16/([^/]++)(*:488)' + .'|/route15/([^/]++)(*:442)' + .')|(?:(?:[^./]*+\\.)++)(?' + .'|/route16/([^/]++)(*:490)' .'|/a/(?' - .'|a\\.\\.\\.(*:509)' + .'|a\\.\\.\\.(*:511)' .'|b/(?' - .'|([^/]++)(*:530)' - .'|c/([^/]++)(*:548)' + .'|([^/]++)(*:532)' + .'|c/([^/]++)(*:550)' .')' .')' .')' @@ -132,7 +132,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher foreach ($regexList as $offset => $regex) { while (preg_match($regex, $matchedPathinfo, $matches)) { switch ($m = (int) $matches['MARK']) { - case 115: + case 116: $matches = array('foo' => $matches[1] ?? null); // baz4 @@ -159,7 +159,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher not_bazbaz6: break; - case 160: + case 161: $matches = array('foo' => $matches[1] ?? null); // foo1 @@ -173,14 +173,14 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher not_foo1: break; - case 204: + case 205: $matches = array('foo1' => $matches[1] ?? null); // foo2 return $this->mergeDefaults(array('_route' => 'foo2') + $matches, array()); break; - case 279: + case 280: $matches = array('_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null); // foo3 @@ -189,23 +189,23 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher break; default: $routes = array( - 46 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), - 69 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), - 89 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), - 131 => array(array('_route' => 'quoter'), array('quoter'), null, null), - 168 => array(array('_route' => 'bar1'), array('bar'), null, null), - 181 => array(array('_route' => 'overridden'), array('var'), null, null), - 212 => array(array('_route' => 'bar2'), array('bar1'), null, null), - 248 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), - 287 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), - 309 => array(array('_route' => 'foo4'), array('foo'), null, null), - 371 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), - 389 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), - 441 => array(array('_route' => 'route15'), array('name'), null, null), - 488 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), - 509 => array(array('_route' => 'a'), array(), null, null), - 530 => array(array('_route' => 'b'), array('var'), null, null), - 548 => array(array('_route' => 'c'), array('var'), null, null), + 47 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), + 70 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), + 90 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), + 132 => array(array('_route' => 'quoter'), array('quoter'), null, null), + 169 => array(array('_route' => 'bar1'), array('bar'), null, null), + 182 => array(array('_route' => 'overridden'), array('var'), null, null), + 213 => array(array('_route' => 'bar2'), array('bar1'), null, null), + 249 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), + 288 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), + 310 => array(array('_route' => 'foo4'), array('foo'), null, null), + 372 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), + 390 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), + 442 => array(array('_route' => 'route15'), array('name'), null, null), + 490 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), + 511 => array(array('_route' => 'a'), array(), null, null), + 532 => array(array('_route' => 'b'), array('var'), null, null), + 550 => array(array('_route' => 'c'), array('var'), null, null), ); list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; @@ -231,7 +231,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Matcher\UrlMatcher return $ret; } - if (548 === $m) { + if (550 === $m) { break; } $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); 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 79b650eb5b..a711dbaf61 100644 --- a/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php +++ b/src/Symfony/Component/Routing/Tests/Fixtures/dumper/url_matcher2.php @@ -119,47 +119,47 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec $matchedPathinfo = $host.'.'.$pathinfo; $regexList = array( 0 => '{^(?' - .'|(?:(?:[^.]*+\\.)++)(?' - .'|/foo/(baz|symfony)(*:46)' + .'|(?:(?:[^./]*+\\.)++)(?' + .'|/foo/(baz|symfony)(*:47)' .'|/bar(?' - .'|/([^/]++)(*:69)' - .'|head/([^/]++)(*:89)' + .'|/([^/]++)(*:70)' + .'|head/([^/]++)(*:90)' .')' .'|/test/([^/]++)/(?' - .'|(*:115)' + .'|(*:116)' .')' - .'|/([\']+)(*:131)' + .'|/([\']+)(*:132)' .'|/a/(?' .'|b\'b/([^/]++)(?' - .'|(*:160)' - .'|(*:168)' + .'|(*:161)' + .'|(*:169)' .')' - .'|(.*)(*:181)' + .'|(.*)(*:182)' .'|b\'b/([^/]++)(?' - .'|(*:204)' - .'|(*:212)' + .'|(*:205)' + .'|(*:213)' .')' .')' - .'|/multi/hello(?:/([^/]++))?(*:248)' + .'|/multi/hello(?:/([^/]++))?(*:249)' .'|/([^/]++)/b/([^/]++)(?' - .'|(*:279)' - .'|(*:287)' + .'|(*:280)' + .'|(*:288)' .')' - .'|/aba/([^/]++)(*:309)' + .'|/aba/([^/]++)(*:310)' .')|(?i:([^\\.]++)\\.example\\.com)\\.(?' .'|/route1(?' - .'|3/([^/]++)(*:371)' - .'|4/([^/]++)(*:389)' + .'|3/([^/]++)(*:372)' + .'|4/([^/]++)(*:390)' .')' .')|(?i:c\\.example\\.com)\\.(?' - .'|/route15/([^/]++)(*:441)' - .')|(?:(?:[^.]*+\\.)++)(?' - .'|/route16/([^/]++)(*:488)' + .'|/route15/([^/]++)(*:442)' + .')|(?:(?:[^./]*+\\.)++)(?' + .'|/route16/([^/]++)(*:490)' .'|/a/(?' - .'|a\\.\\.\\.(*:509)' + .'|a\\.\\.\\.(*:511)' .'|b/(?' - .'|([^/]++)(*:530)' - .'|c/([^/]++)(*:548)' + .'|([^/]++)(*:532)' + .'|c/([^/]++)(*:550)' .')' .')' .')' @@ -169,7 +169,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec foreach ($regexList as $offset => $regex) { while (preg_match($regex, $matchedPathinfo, $matches)) { switch ($m = (int) $matches['MARK']) { - case 115: + case 116: $matches = array('foo' => $matches[1] ?? null); // baz4 @@ -196,7 +196,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec not_bazbaz6: break; - case 160: + case 161: $matches = array('foo' => $matches[1] ?? null); // foo1 @@ -210,14 +210,14 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec not_foo1: break; - case 204: + case 205: $matches = array('foo1' => $matches[1] ?? null); // foo2 return $this->mergeDefaults(array('_route' => 'foo2') + $matches, array()); break; - case 279: + case 280: $matches = array('_locale' => $matches[1] ?? null, 'foo' => $matches[2] ?? null); // foo3 @@ -226,23 +226,23 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec break; default: $routes = array( - 46 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), - 69 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), - 89 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), - 131 => array(array('_route' => 'quoter'), array('quoter'), null, null), - 168 => array(array('_route' => 'bar1'), array('bar'), null, null), - 181 => array(array('_route' => 'overridden'), array('var'), null, null), - 212 => array(array('_route' => 'bar2'), array('bar1'), null, null), - 248 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), - 287 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), - 309 => array(array('_route' => 'foo4'), array('foo'), null, null), - 371 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), - 389 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), - 441 => array(array('_route' => 'route15'), array('name'), null, null), - 488 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), - 509 => array(array('_route' => 'a'), array(), null, null), - 530 => array(array('_route' => 'b'), array('var'), null, null), - 548 => array(array('_route' => 'c'), array('var'), null, null), + 47 => array(array('_route' => 'foo', 'def' => 'test'), array('bar'), null, null), + 70 => array(array('_route' => 'bar'), array('foo'), array('GET' => 0, 'HEAD' => 1), null), + 90 => array(array('_route' => 'barhead'), array('foo'), array('GET' => 0), null), + 132 => array(array('_route' => 'quoter'), array('quoter'), null, null), + 169 => array(array('_route' => 'bar1'), array('bar'), null, null), + 182 => array(array('_route' => 'overridden'), array('var'), null, null), + 213 => array(array('_route' => 'bar2'), array('bar1'), null, null), + 249 => array(array('_route' => 'helloWorld', 'who' => 'World!'), array('who'), null, null), + 288 => array(array('_route' => 'bar3'), array('_locale', 'bar'), null, null), + 310 => array(array('_route' => 'foo4'), array('foo'), null, null), + 372 => array(array('_route' => 'route13'), array('var1', 'name'), null, null), + 390 => array(array('_route' => 'route14', 'var1' => 'val'), array('var1', 'name'), null, null), + 442 => array(array('_route' => 'route15'), array('name'), null, null), + 490 => array(array('_route' => 'route16', 'var1' => 'val'), array('name'), null, null), + 511 => array(array('_route' => 'a'), array(), null, null), + 532 => array(array('_route' => 'b'), array('var'), null, null), + 550 => array(array('_route' => 'c'), array('var'), null, null), ); list($ret, $vars, $requiredMethods, $requiredSchemes) = $routes[$m]; @@ -268,7 +268,7 @@ class ProjectUrlMatcher extends Symfony\Component\Routing\Tests\Fixtures\Redirec return $ret; } - if (548 === $m) { + if (550 === $m) { break; } $regex = substr_replace($regex, 'F', $m - $offset, 1 + strlen($m)); diff --git a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php index 4bbfe131a7..a1c28ecab4 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/Dumper/PhpMatcherDumperTest.php @@ -491,6 +491,18 @@ class PhpMatcherDumperTest extends TestCase return $this->matcherClass; } + + /** + * @expectedException \InvalidArgumentException + * @expectedExceptionMessage Symfony\Component\Routing\Route cannot contain objects + */ + public function testGenerateDumperMatcherWithObject() + { + $routeCollection = new RouteCollection(); + $routeCollection->add('_', new Route('/', array(new \stdClass()))); + $dumper = new PhpMatcherDumper($routeCollection); + $dumper->dump(); + } } abstract class RedirectableUrlMatcherStub extends UrlMatcher implements RedirectableUrlMatcherInterface diff --git a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php index f0013d7bc3..5a34535eb6 100644 --- a/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php +++ b/src/Symfony/Component/Routing/Tests/Matcher/UrlMatcherTest.php @@ -670,6 +670,16 @@ class UrlMatcherTest extends TestCase $this->assertEquals('c', $matcher->match('/admin/api/package.json')['_route']); } + public function testHostWithDot() + { + $coll = new RouteCollection(); + $coll->add('a', new Route('/foo', array(), array(), array(), 'foo.example.com')); + $coll->add('b', new Route('/bar/{baz}')); + + $matcher = $this->getUrlMatcher($coll); + $this->assertEquals('b', $matcher->match('/bar/abc.123')['_route']); + } + protected function getUrlMatcher(RouteCollection $routes, RequestContext $context = null) { return new UrlMatcher($routes, $context ?: new RequestContext());