set s-maxage only if all responses are cacheable
This commit is contained in:
parent
0451003397
commit
b7d93381a2
@ -32,6 +32,7 @@ class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
|
|||||||
private $embeddedResponses = 0;
|
private $embeddedResponses = 0;
|
||||||
private $ttls = array();
|
private $ttls = array();
|
||||||
private $maxAges = array();
|
private $maxAges = array();
|
||||||
|
private $isNotCacheableResponseEmbedded = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
@ -41,8 +42,13 @@ class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
|
|||||||
if ($response->isValidateable()) {
|
if ($response->isValidateable()) {
|
||||||
$this->cacheable = false;
|
$this->cacheable = false;
|
||||||
} else {
|
} else {
|
||||||
|
$maxAge = $response->getMaxAge();
|
||||||
$this->ttls[] = $response->getTtl();
|
$this->ttls[] = $response->getTtl();
|
||||||
$this->maxAges[] = $response->getMaxAge();
|
$this->maxAges[] = $maxAge;
|
||||||
|
|
||||||
|
if (null === $maxAge) {
|
||||||
|
$this->isNotCacheableResponseEmbedded = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
++$this->embeddedResponses;
|
++$this->embeddedResponses;
|
||||||
@ -76,7 +82,9 @@ class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface
|
|||||||
$this->ttls[] = $response->getTtl();
|
$this->ttls[] = $response->getTtl();
|
||||||
$this->maxAges[] = $response->getMaxAge();
|
$this->maxAges[] = $response->getMaxAge();
|
||||||
|
|
||||||
if (null !== $maxAge = min($this->maxAges)) {
|
if ($this->isNotCacheableResponseEmbedded) {
|
||||||
|
$response->headers->removeCacheControlDirective('s-maxage');
|
||||||
|
} elseif (null !== $maxAge = min($this->maxAges)) {
|
||||||
$response->setSharedMaxAge($maxAge);
|
$response->setSharedMaxAge($maxAge);
|
||||||
$response->headers->set('Age', $maxAge - min($this->ttls));
|
$response->headers->set('Age', $maxAge - min($this->ttls));
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,77 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* This code is partially based on the Rack-Cache library by Ryan Tomayko,
|
||||||
|
* which is released under the MIT license.
|
||||||
|
* (based on commit 02d2b48d75bcb63cf1c0c7149c077ad256542801)
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\HttpKernel\Tests\HttpCache;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\HttpKernel\HttpCache\EsiResponseCacheStrategy;
|
||||||
|
|
||||||
|
class EsiResponseCacheStrategyTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function testMinimumSharedMaxAgeWins()
|
||||||
|
{
|
||||||
|
$cacheStrategy = new EsiResponseCacheStrategy();
|
||||||
|
|
||||||
|
$response1 = new Response();
|
||||||
|
$response1->setSharedMaxAge(60);
|
||||||
|
$cacheStrategy->add($response1);
|
||||||
|
|
||||||
|
$response2 = new Response();
|
||||||
|
$response2->setSharedMaxAge(3600);
|
||||||
|
$cacheStrategy->add($response2);
|
||||||
|
|
||||||
|
$response = new Response();
|
||||||
|
$response->setSharedMaxAge(86400);
|
||||||
|
$cacheStrategy->update($response);
|
||||||
|
|
||||||
|
$this->assertSame('60', $response->headers->getCacheControlDirective('s-maxage'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSharedMaxAgeNotSetIfNotSetInAnyEmbeddedRequest()
|
||||||
|
{
|
||||||
|
$cacheStrategy = new EsiResponseCacheStrategy();
|
||||||
|
|
||||||
|
$response1 = new Response();
|
||||||
|
$response1->setSharedMaxAge(60);
|
||||||
|
$cacheStrategy->add($response1);
|
||||||
|
|
||||||
|
$response2 = new Response();
|
||||||
|
$cacheStrategy->add($response2);
|
||||||
|
|
||||||
|
$response = new Response();
|
||||||
|
$response->setSharedMaxAge(86400);
|
||||||
|
$cacheStrategy->update($response);
|
||||||
|
|
||||||
|
$this->assertFalse($response->headers->hasCacheControlDirective('s-maxage'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSharedMaxAgeNotSetIfNotSetInMasterRequest()
|
||||||
|
{
|
||||||
|
$cacheStrategy = new EsiResponseCacheStrategy();
|
||||||
|
|
||||||
|
$response1 = new Response();
|
||||||
|
$response1->setSharedMaxAge(60);
|
||||||
|
$cacheStrategy->add($response1);
|
||||||
|
|
||||||
|
$response2 = new Response();
|
||||||
|
$response2->setSharedMaxAge(3600);
|
||||||
|
$cacheStrategy->add($response2);
|
||||||
|
|
||||||
|
$response = new Response();
|
||||||
|
$cacheStrategy->update($response);
|
||||||
|
|
||||||
|
$this->assertFalse($response->headers->hasCacheControlDirective('s-maxage'));
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user