[HttpFoundation] Add support for all core http control directives

This commit is contained in:
azjezz 2020-04-01 11:36:04 +01:00
parent 2130465899
commit 011cd38974
3 changed files with 44 additions and 6 deletions

View File

@ -15,6 +15,7 @@ CHANGELOG
* made the Mime component an optional dependency
* added `MarshallingSessionHandler`, `IdentityMarshaller`
* made `Session` accept a callback to report when the session is being used
* Add support for all core cache control directives
5.0.0
-----

View File

@ -85,6 +85,24 @@ class Response
const HTTP_NOT_EXTENDED = 510; // RFC2774
const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511; // RFC6585
/**
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
*/
private const HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES = [
'must_revalidate' => false,
'no_cache' => false,
'no_store' => false,
'no_transform' => false,
'public' => false,
'private' => false,
'proxy_revalidate' => false,
'max_age' => true,
's_maxage' => true,
'immutable' => false,
'last_modified' => true,
'etag' => true,
];
/**
* @var ResponseHeaderBag
*/
@ -921,7 +939,7 @@ class Response
/**
* Sets the response's cache headers (validation and/or expiration).
*
* Available options are: etag, last_modified, max_age, s_maxage, private, public and immutable.
* Available options are: must_revalidate, no_cache, no_store, no_transform, public, private, proxy_revalidate, max_age, s_maxage, immutable, last_modified and etag.
*
* @return $this
*
@ -931,7 +949,7 @@ class Response
*/
public function setCache(array $options): object
{
if ($diff = array_diff(array_keys($options), ['etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public', 'immutable'])) {
if ($diff = array_diff(array_keys($options), array_keys(static::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES))) {
throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', $diff)));
}
@ -951,6 +969,16 @@ class Response
$this->setSharedMaxAge($options['s_maxage']);
}
foreach (self::HTTP_RESPONSE_CACHE_CONTROL_DIRECTIVES as $directive => $hasValue) {
if (!$hasValue && isset($options[$directive])) {
if ($options[$directive]) {
$this->headers->addCacheControlDirective(str_replace('_', '-', $directive));
} else {
$this->headers->removeCacheControlDirective(str_replace('_', '-', $directive));
}
}
}
if (isset($options['public'])) {
if ($options['public']) {
$this->setPublic();
@ -967,10 +995,6 @@ class Response
}
}
if (isset($options['immutable'])) {
$this->setImmutable((bool) $options['immutable']);
}
return $this;
}

View File

@ -659,6 +659,19 @@ class ResponseTest extends ResponseTestCase
$response->setCache(['immutable' => false]);
$this->assertFalse($response->headers->hasCacheControlDirective('immutable'));
$directives = ['proxy_revalidate', 'must_revalidate', 'no_cache', 'no_store', 'no_transform'];
foreach ($directives as $directive) {
$response->setCache([$directive => true]);
$this->assertTrue($response->headers->hasCacheControlDirective(str_replace('_', '-', $directive)));
}
foreach ($directives as $directive) {
$response->setCache([$directive => false]);
$this->assertFalse($response->headers->hasCacheControlDirective(str_replace('_', '-', $directive)));
}
}
public function testSendContent()