8000 [HttpKernel] Send new session cookie from AbstractTestSessionListener… · mssimi/symfony@98f5d53 · GitHub
[go: up one dir, main page]

Skip to content

Commit 98f5d53

Browse files
rpkampnicolas-grekas
authored andcommitted
[HttpKernel] Send new session cookie from AbstractTestSessionListener after session invalidation
1 parent fcca141 commit 98f5d53

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/Symfony/Component/HttpKernel/EventListener/AbstractTestSessionListener.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
*/
3030
abstract class AbstractTestSessionListener implements EventSubscriberInterface
3131
{
32+
private $sessionId;
33+
3234
public function onKernelRequest(GetResponseEvent $event)
3335
{
3436
if (!$event->isMasterRequest()) {
@@ -44,7 +46,8 @@ public function onKernelRequest(GetResponseEvent $event)
4446
$cookies = $event->getRequest()->cookies;
4547

4648
if ($cookies->has($session->getName())) {
47-
$session->setId($cookies->get($session->getName()));
49+
$this->sessionId = $cookies->get($session->getName());
50+
$session->setId($this->sessionId);
4851
}
4952
}
5053

@@ -66,9 +69,10 @@ public function onKernelResponse(FilterResponseEvent $event)
6669
$session->save();
6770
}
6871

69-
if ($session instanceof Session ? !$session->isEmpty() : $wasStarted) {
72+
if ($session instanceof Session ? !$session->isEmpty() || $session->getId() !== $this->sessionId : $wasStarted) {
7073
$params = session_get_cookie_params();
7174
$event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), 0 === $params['lifetime'] ? 0 : time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
75+
$this->sessionId = $session->getId();
7276
}
7377
}
7478

src/Symfony/Component/HttpKernel/Tests/EventListener/TestSessionListenerTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
16+
use Symfony\Component\HttpFoundation\Cookie;
1617
use Symfony\Component\HttpFoundation\Response;
1718
use Symfony\Component\HttpFoundation\Request;
19+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
1820
use Symfony\Component\HttpKernel\HttpKernelInterface;
1921
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
2022
use Symfony\Component\HttpKernel\EventListener\SessionListener;
@@ -86,6 +88,22 @@ public function testEmptySessionDoesNotSendCookie()
8688
$this->assertSame(array(), $response->headers->getCookies());
8789
}
8890

91+
public function testEmptySessionWithNewSessionIdDoesSendCookie()
92+
{
93+
$this->sessionHasBeenStarted();
94+
$this->sessionIsEmpty();
95+
$this->fixSessionId('456');
96+
97+
$kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
98+
$request = Request::create('/', 'GET', array(), array(new Cookie('MOCKSESSID', '123')));
99+
$event = new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
100+
$this->listener->onKernelRequest($event);
101+
102+
$response = $this->filterResponse(new Request(), HttpKernelInterface::MASTER_REQUEST);
103+
104+
$this->assertNotEmpty($response->headers->getCookies());
105+
}
106+
89107
public function testUnstartedSessionIsNotSave()
90108
{
91109
$this->sessionHasNotBeenStarted();
@@ -150,6 +168,13 @@ private function sessionIsEmpty()
150168
->will($this->returnValue(true));
151169
}
152170

171+
private function fixSessionId($sessionId)
172+
{
173+
$this->session->expects($this->any())
174+
->method('getId')
175+
->will($this->returnValue($sessionId));
176+
}
177+
153178
private function getSession()
154179
{
155180
$mock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')

0 commit comments

Comments
 (0)
0