Skip to content

Commit 9fe958a

Browse files
Merge branch '6.0' into 6.1
* 6.0: [Notifier] composer.json cleanup [HttpKernel] AbstractSessionListener should not override the cache lifetime for private responses [DependencyInjection] Shared private services becomes public after a public service is accessed [DI] Fix undefined class in test
2 parents 2e5f877 + f81630f commit 9fe958a

File tree

2 files changed

+62
-2
lines changed

2 files changed

+62
-2
lines changed

EventListener/AbstractSessionListener.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,11 @@ public function onKernelResponse(ResponseEvent $event)
195195
}
196196

197197
if ($autoCacheControl) {
198+
$maxAge = $response->headers->hasCacheControlDirective('public') ? 0 : (int) $response->getMaxAge();
198199
$response
199-
->setExpires(new \DateTime())
200+
->setExpires(new \DateTimeImmutable('+'.$maxAge.' seconds'))
200201
->setPrivate()
201-
->setMaxAge(0)
202+
->setMaxAge($maxAge)
202203
->headers->addCacheControlDirective('must-revalidate');
203204
}
204205

Tests/EventListener/SessionListenerTest.php

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class SessionListenerTest extends TestCase
3838
{
3939
/**
4040
* @dataProvider provideSessionOptions
41+
*
4142
* @runInSeparateProcess
4243
*/
4344
public function testSessionCookieOptions(array $phpSessionOptions, array $sessionOptions, array $expectedSessionOptions)
@@ -554,6 +555,64 @@ public function testUninitializedSessionWithoutInitializedSession()
554555
$this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage'));
555556
}
556557

558+
public function testResponseHeadersMaxAgeAndExpiresNotBeOverridenIfSessionStarted()
559+
{
560+
$session = $this->createMock(Session::class);
561+
$session->expects($this->exactly(2))->method('getUsageIndex')->will($this->onConsecutiveCalls(0, 1));
562+
563+
$container = new Container();
564+
$container->set('initialized_session', $session);
565+
566+
$listener = new SessionListener($container);
567+
$kernel = $this->createMock(HttpKernelInterface::class);
568+
569+
$request = new Request();
570+
$listener->onKernelRequest(new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST));
571+
572+
$response = new Response();
573+
$response->setPrivate();
574+
$expiresHeader = gmdate('D, d M Y H:i:s', time() + 600).' GMT';
575+
$response->setMaxAge(600);
576+
$listener->onKernelResponse(new ResponseEvent($kernel, new Request(), HttpKernelInterface::MAIN_REQUEST, $response));
577+
578+
$this->assertTrue($response->headers->has('expires'));
579+
$this->assertSame($expiresHeader, $response->headers->get('expires'));
580+
$this->assertFalse($response->headers->has('max-age'));
581+
$this->assertSame('600', $response->headers->getCacheControlDirective('max-age'));
582+
$this->assertFalse($response->headers->hasCacheControlDirective('public'));
583+
$this->assertTrue($response->headers->hasCacheControlDirective('private'));
584+
$this->assertTrue($response->headers->hasCacheControlDirective('must-revalidate'));
585+
$this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER));
586+
}
587+
588+
public function testResponseHeadersMaxAgeAndExpiresDefaultValuesIfSessionStarted()
589+
{
590+
$session = $this->createMock(Session::class);
591+
$session->expects($this->exactly(2))->method('getUsageIndex')->will($this->onConsecutiveCalls(0, 1));
592+
593+
$container = new Container();
594+
$container->set('initialized_session', $session);
595+
596+
$listener = new SessionListener($container);
597+
$kernel = $this->createMock(HttpKernelInterface::class);
598+
599+
$request = new Request();
600+
$listener->onKernelRequest(new RequestEvent($kernel, $request, HttpKernelInterface::MAIN_REQUEST));
601+
602+
$response = new Response();
603+
$expiresHeader = gmdate('D, d M Y H:i:s', time()).' GMT';
604+
$listener->onKernelResponse(new ResponseEvent($kernel, new Request(), HttpKernelInterface::MAIN_REQUEST, $response));
605+
606+
$this->assertTrue($response->headers->has('expires'));
607+
$this->assertSame($expiresHeader, $response->headers->get('expires'));
608+
$this->assertFalse($response->headers->has('max-age'));
609+
$this->assertSame('0', $response->headers->getCacheControlDirective('max-age'));
610+
$this->assertFalse($response->headers->hasCacheControlDirective('public'));
611+
$this->assertTrue($response->headers->hasCacheControlDirective('private'));
612+
$this->assertTrue($response->headers->hasCacheControlDirective('must-revalidate'));
613+
$this->assertFalse($response->headers->has(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER));
614+
}
615+
557616
public function testSurrogateMainRequestIsPublic()
558617
{
559618
$session = $this->createMock(Session::class);

0 commit comments

Comments
 (0)