Skip to content

Commit f7e09d0

Browse files
Merge branch '5.1' into 5.x
* 5.1: [Process] Dont test TTY if there is no TTY support Fixing some Mongolian translating the validators for european portuguese language Fix CI Update validators.he.xlf Update security.he.xlf Update validators.he.xlf Improve performances in CircualReference detection [PHPUnitBridge] Fixed crash on Windows with PHP 8 Fix session called initized several time
2 parents 46af71a + a578fae commit f7e09d0

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

EventListener/AbstractSessionListener.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ public function onKernelRequest(RequestEvent $event)
5959
$session = null;
6060
$request = $event->getRequest();
6161
if (!$request->hasSession()) {
62-
$request->setSessionFactory(function () { return $this->getSession(); });
62+
$sess = null;
63+
$request->setSessionFactory(function () use (&$sess) { return $sess ?? $sess = $this->getSession(); });
6364
}
6465

6566
$session = $session ?? ($this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : null);

Tests/EventListener/SessionListenerTest.php

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
2323
use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
2424
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
25+
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
2526
use Symfony\Component\HttpKernel\Event\RequestEvent;
2627
use Symfony\Component\HttpKernel\Event\ResponseEvent;
2728
use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
2829
use Symfony\Component\HttpKernel\EventListener\SessionListener;
2930
use Symfony\Component\HttpKernel\Exception\UnexpectedSessionUsageException;
3031
use Symfony\Component\HttpKernel\HttpKernelInterface;
32+
use Symfony\Component\HttpKernel\KernelInterface;
3133

3234
class SessionListenerTest extends TestCase
3335
{
@@ -182,6 +184,38 @@ public function testSurrogateMasterRequestIsPublic()
182184
$this->assertLessThanOrEqual((new \DateTime('now', new \DateTimeZone('UTC'))), (new \DateTime($response->headers->get('Expires'))));
183185
}
184186

187+
public function testGetSessionIsCalledOnce()
188+
{
189+
$session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
190+
$sessionStorage = $this->getMockBuilder(NativeSessionStorage::class)->getMock();
191+
$kernel = $this->getMockBuilder(KernelInterface::class)->getMock();
192+
193+
$sessionStorage->expects($this->once())
194+
->method('setOptions')
195+
->with(['cookie_secure' => true]);
196+
197+
$requestStack = new RequestStack();
198+
$requestStack->push($masterRequest = new Request([], [], [], [], [], ['HTTPS' => 'on']));
199+
200+
$container = new Container();
201+
$container->set('session_storage', $sessionStorage);
202+
$container->set('session', $session);
203+
$container->set('request_stack', $requestStack);
204+
205+
$event = new GetResponseEvent($kernel, $masterRequest, HttpKernelInterface::MASTER_REQUEST);
206+
207+
$listener = new SessionListener($container);
208+
$listener->onKernelRequest($event);
209+
210+
$subRequest = $masterRequest->duplicate();
211+
// at this point both master and subrequest have a closure to build the session
212+
213+
$masterRequest->getSession();
214+
215+
// calling the factory on the subRequest should not trigger a second call to storage->sesOptions()
216+
$subRequest->getSession();
217+
}
218+
185219
public function testSessionUsageExceptionIfStatelessAndSessionUsed()
186220
{
187221
$session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();

0 commit comments

Comments
 (0)