Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[HttpKernel] added a way to change the ESI cache strategy
- Loading branch information
Showing
5 changed files
with
127 additions
and
32 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
68 changes: 68 additions & 0 deletions
68
src/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategy.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <fabien.potencier@symfony-project.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\HttpCache; | ||
|
||
use Symfony\Component\HttpFoundation\Response; | ||
|
||
/** | ||
* EsiResponseCacheStrategy knows how to compute the Response cache HTTP header | ||
* based on the different ESI response cache headers. | ||
* | ||
* This implementation changes the master response TTL to the smallest TTL received | ||
* or force validation if one of the ESI has validation cache strategy. | ||
* | ||
* @author Fabien Potencier <fabien.potencier@symfony-project.com> | ||
*/ | ||
class EsiResponseCacheStrategy implements EsiResponseCacheStrategyInterface | ||
{ | ||
protected $cacheable = true; | ||
protected $ttls = array(); | ||
protected $maxAges = array(); | ||
|
||
/** | ||
* Adds a Response. | ||
* | ||
* @param Response $response | ||
*/ | ||
public function add(Response $response) | ||
{ | ||
if ($response->isValidateable()) { | ||
$this->cacheable = false; | ||
} else { | ||
$this->ttls[] = $response->getTtl(); | ||
$this->maxAges[] = $response->getMaxAge(); | ||
} | ||
} | ||
|
||
/** | ||
* Updates the Response HTTP headers based on the embedded Responses. | ||
* | ||
* @param Response $response | ||
*/ | ||
public function update(Response $response) | ||
{ | ||
if (!$this->cacheable) { | ||
$response->headers->set('Cache-Control', 'no-cache, must-revalidate'); | ||
|
||
return; | ||
} | ||
|
||
$maxAge = min($this->maxAges); | ||
$response->setSharedMaxAge($maxAge); | ||
$response->setMaxAge(0); | ||
$response->headers->set('Age', $maxAge - min($this->ttls)); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
src/Symfony/Component/HttpKernel/HttpCache/EsiResponseCacheStrategyInterface.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
<?php | ||
|
||
/* | ||
* This file is part of the Symfony package. | ||
* | ||
* (c) Fabien Potencier <fabien.potencier@symfony-project.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\HttpCache; | ||
|
||
use Symfony\Component\HttpFoundation\Response; | ||
|
||
/** | ||
* EsiResponseCacheStrategyInterface implementations know how to compute the | ||
* Response cache HTTP header based on the different ESI response cache headers. | ||
* | ||
* @author Fabien Potencier <fabien.potencier@symfony-project.com> | ||
*/ | ||
interface EsiResponseCacheStrategyInterface | ||
{ | ||
/** | ||
* Adds a Response. | ||
* | ||
* @param Response $response | ||
*/ | ||
function add(Response $response); | ||
|
||
/** | ||
* Updates the Response HTTP headers based on the embedded Responses. | ||
* | ||
* @param Response $response | ||
*/ | ||
function update(Response $response); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters