Skip to content

Commit 7d01d90

Browse files
Merge branch '6.4' into 7.3
* 6.4: Fix ord()-related PHP 8.5 deprecations [FrameworkBundle] Perform-no-deep-merging on workflow transitions' from/to configs [HttpKernel] Refine Vary header check to skip special handling of 'Accept-Language' when it's the only entry and '_vary_by_language' is `true` in `CacheAttributeListener`
2 parents aa57d9a + 6b9ab1a commit 7d01d90

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

EventListener/CacheAttributeListener.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,9 @@ public function onKernelResponse(ResponseEvent $event): void
119119

120120
unset($this->lastModified[$request]);
121121
unset($this->etags[$request]);
122-
$hasVary = $response->headers->has('Vary');
122+
// Check if the response has a Vary header that should be considered, ignoring cases where
123+
// it's only 'Accept-Language' and the request has the '_vary_by_language' attribute
124+
$hasVary = ['Accept-Language'] === $response->getVary() ? !$request->attributes->get('_vary_by_language') : $response->hasVary();
123125

124126
foreach (array_reverse($attributes) as $cache) {
125127
if (null !== $cache->smaxage && !$response->headers->hasCacheControlDirective('s-maxage')) {

Tests/EventListener/CacheAttributeListenerTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,70 @@ public function testAttribute()
365365
$this->assertSame(CacheAttributeController::CLASS_SMAXAGE, $response->getMaxAge());
366366
}
367367

368+
/**
369+
* @dataProvider provideVaryHeaderScenarios
370+
*/
371+
public function testHasRelevantVaryHeaderBehavior(array $responseVary, array $cacheVary, bool $varyByLanguage, array $expectedVary)
372+
{
373+
$request = $this->createRequest(new Cache(vary: $cacheVary));
374+
$request->attributes->set('_vary_by_language', $varyByLanguage);
375+
376+
$response = new Response();
377+
$response->setVary($responseVary);
378+
379+
$listener = new CacheAttributeListener();
380+
$event = new ResponseEvent($this->getKernel(), $request, HttpKernelInterface::MAIN_REQUEST, $response);
381+
$listener->onKernelResponse($event);
382+
383+
$this->assertSame($expectedVary, $response->getVary());
384+
}
385+
386+
public static function provideVaryHeaderScenarios(): \Traversable
387+
{
388+
yield 'no vary headers at all' => [
389+
'responseVary' => [],
390+
'cacheVary' => ['X-Foo'],
391+
'varyByLanguage' => false,
392+
'expectedVary' => ['X-Foo'],
393+
];
394+
yield 'response vary accept-language only, vary_by_language true (append new)' => [
395+
'responseVary' => ['Accept-Language'],
396+
'cacheVary' => ['X-Bar'],
397+
'varyByLanguage' => true,
398+
'expectedVary' => ['Accept-Language', 'X-Bar'], // X-Bar is added
399+
];
400+
yield 'response vary accept-language only, vary_by_language false (no append)' => [
401+
'responseVary' => ['Accept-Language'],
402+
'cacheVary' => ['X-Bar'],
403+
'varyByLanguage' => false,
404+
'expectedVary' => ['Accept-Language'], // no append
405+
];
406+
yield 'response vary multiple including accept-language, vary_by_language true (no append)' => [
407+
'responseVary' => ['Accept-Language', 'User-Agent'],
408+
'cacheVary' => ['X-Baz'],
409+
'varyByLanguage' => true,
410+
'expectedVary' => ['Accept-Language', 'User-Agent'], // no append
411+
];
412+
yield 'cache vary is empty' => [
413+
'responseVary' => ['X-Existing'],
414+
'cacheVary' => [],
415+
'varyByLanguage' => true,
416+
'expectedVary' => ['X-Existing'], // nothing to add
417+
];
418+
yield 'vary * (no append) — vary_by_language=true' => [
419+
'responseVary' => ['*'],
420+
'cacheVary' => ['X-Foo'],
421+
'varyByLanguage' => true,
422+
'expectedVary' => ['*'],
423+
];
424+
yield 'vary * (no append) — vary_by_language=false' => [
425+
'responseVary' => ['*'],
426+
'cacheVary' => ['X-Foo'],
427+
'varyByLanguage' => false,
428+
'expectedVary' => ['*'],
429+
];
430+
}
431+
368432
private function createRequest(Cache $cache): Request
369433
{
370434
return new Request([], [], ['_cache' => [$cache]]);

0 commit comments

Comments
 (0)