Internet-Draft | CDNI Cache Control Metadata | March 2023 |
Power & Goldstein | Expires 14 September 2023 | [Page] |
This specification adds to the basic Cache Control metadata defined in RFC8006, providing Content Providers and uCDNs more fine-grained control over dCDN caching. Use cases include overriding or adjusting cache-control headers from the origin, bypassing caching altogether, or altering cache keys with dynamically generated values.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 14 September 2023.¶
Copyright (c) 2023 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
In addition to the cache control parameters currently specified by Cache object in [RFC8006], Content Providers and uCDNs often need more fine-grained control over dCDN caching, including scenarios where it is desirable to override or adjust cache-control headers from the origin.¶
These capabilities are required for commercial CDN and open caching use cases:¶
Positive Cache Control - Allows the uCDN to specify internal caching policies for the dCDN and external caching policies advertised to clients of the dCDN, overriding any cache control policy set in the response from the uCDN.¶
CachePolicy is a new GenericMetadata object that allows for the uCDN to specify internal caching policies for the dCDN, as well as external caching policies advertised to clients of the dCDN (overriding any cache control policy set in the response from the uCDN).¶
Property: internal¶
Property: external¶
Property: force-internal¶
Property: force-external¶
Example 1: An MI.CachePolicy that sets the internal cache control policy to five seconds. The external cache policy is set to 'no-cache', and both policies are forced:¶
{ "generic-metadata-type": "MI.CachePolicy", "generic-metadata-value": { "internal": "5", "external": "no-cache", "force-internal": "true", "force-external": "true" } }¶
Example 2: An MI.CachePolicy that sets the internal cache control policy to "as-is" (keep the policy set in the response from the uCDN). The external cache policy is set to 'no-cache' and forced:¶
{ "generic-metadata-type": "MI.CachePolicy", "generic-metadata-value": { "internal": "as-is", "external": "no-cache", "force-external": "true" } }¶
Example 3: An MI.CachePolicy in the context of the processing stages model that sets a caching policy only if the HTTP status code received from the origin is a 200. In this example, the internal cache control policy is set to five seconds. The external cache policy is set to 'no-cache'. Internal and external force flags are both set to ‘False’, indicating that the MI.CachePolicy only applies if there is no cache policy in the response from the uCDN.¶
{ "generic-metadata-type": "MI.ProcessingStages", "generic-metadata-value": { "origin-response": [ { "match": { "expression": "resp.status == 200" }, "stage-metadata": { "generic-metadata": [ { "generic-metadata-type": "MI.CachePolicy", "generic-metadata-value": { "internal": "5", "external": "no-cache", "force-internal": "false", "force-external": "false" } } ] } } ] } }¶
NegativeCachePolicy is a new GenericMetadata object that allows for the specification of caching policies based on response codes received from the origin.¶
Property: error-codes¶
Property: cache-policy¶
Example: A MI.NegativeCachePolicy that applies to HTTP error codes: "404", "503", "504" and sets the internal cache control policy to five seconds and external to 'no-cache'.¶
{ "generic-metadata-type": "MI.NegativeCachePolicy", "generic-metadata-value": { "error-codes": [ "404", "503", "504" ], "cache-policy": { "internal": "5", "external": "no-cache", "force-internal": "true", "force-external": "true" } } }¶
MI.StaleContentCachePolicy is a new GenericMetadata object that allows the uCDN to specify the policy to use by a dCDN when responding with stale content. For example, this policy allows the content provider to specify that stale content be served from cache for a specified time period while refreshes from the origin occur asynchronously.¶
Property: stale-while-revalidating¶
Property: stale-if-error¶
Property: failed-refresh-ttl¶
Example 1: A MI.StaleContentCachePolicy where stale-while-revalidating is true, instructing the dCDN to respond with a stale cached version of the resource while it refreshes the resource with the uCDN in the background:¶
{ "generic-metadata-type": "MI.StaleContentCachePolicy", "generic-metadata-value": { "stale-while-revalidating": true } }¶
Example 2: A MI.StaleContentCachePolicy where stale-if-error instructs the dCDN to use the stale cached resource if it receives an error of type 503 or 504 when trying to refresh the resource with the uCDN.¶
failed-refresh-ttl instructs the dCDN to use a five second cache TTL on the resource that receives an error when refreshing from the uCDN. That is, after five seconds, the dCDN will attempt to refresh the resource with the uCDN.¶
{ "generic-metadata-type": "MI.StaleContentCachePolicy", "generic-metadata-value": { "stale-if-error": [ "503", "504" ], "failed-refresh-ttl": "5" } }¶
Example 3: A MI.StaleContentCachePolicy where stale-while-revalidating is true, instructing the dCDN to respond with a stale cached version of the resource while it refreshes the resource with the uCDN in the background.¶
stale-if-error instructs the dCDN to use the stale cached resource if it receives an error of type 404 or any 5xx status when trying to refresh the resource with the uCDN.¶
failed-refresh-ttl instructs the dCDN to use a five second cache TTL on the resource that receives an error when refreshing from the uCDN. That is, after five seconds, the dCDN will attempt to refresh the resource with the uCDN.¶
{ "generic-metadata-type": "MI.StaleContentCachePolicy", "generic-metadata-value": { "stale-while-revalidating": "true", "stale-if-error": [ "404", "5xx" ], "failed-refresh-ttl": "5" } }¶
CacheBypassPolicy is a new GenericMetadata object that allows a client request to be set as non-cacheable. It is expected that this feature will be used to allow clients to bypass cache when testing the uCDN fill path. Note: CacheBypassPolicy is typically used in conjunction with a path match or match expression on a header value or query parameter. Any content previously cached (by client requests that do not set CacheBypassPolicy) is not evicted.¶
Property: bypass-cache¶
Example 1: A MI.CacheBypassPolicy with the client HTTP header of: CDN-BYPASS: “True”:¶
{ "generic-metadata-type": "MI.ProcessingStages", "generic-metadata-value": { "client-request": [ { "match": { "expression": "req.h.cdn-bypass == 'true'" }, "stage-metadata": { "generic-metadata": [ { "generic-metadata-type": "MI.CacheBypassPolicy", "generic-metadata-value": { "bypass-cache": "true" } } ] } } ] } }¶
Example 2: A MI.CacheBypassPolicy that applies to all requests where the host header is bypass.example.com:¶
{ "generic-metadata-type": "MI.ProcessingStages", "generic-metadata-value": { "client-request": [ { "match": { "expression": "req.h.host == 'bypass.example.com'" }, "stage-metadata": { "generic-metadata": [ { "generic-metadata-type": "MI.CacheBypassPolicy", "generic-metadata-value": { "bypass-cache": "true" } } ] } } ] } }¶
It is typical in advanced CDN configurations to generate cache keys that are dynamically constructed via lightweight processing of various properties of the HTTP request and/or response. As an example, an origin may specify a cache key as a value returned in a specific HTTP response header.¶
ComputedCacheKey is a new GenericMetadata object that allows for the specification of a cache key using the metadata expression language. Typical use cases would involve the construction of a cache key from one or more elements of the HTTP request. In cases where both the ComputedCacheKey and the Cache object are applied, the ComputedCacheKey will take precedence.¶
Property: expression¶
Example, using a custom request header as the cache key instead of the URI path:¶
{ "generic-metadata-type": "MI.ComputedCacheKey", "generic-metadata-value": { "expression": "req.h.X-Cache-Key" } }¶
This specification has defined a new set of Cache Control Metadata objects that meet the needs of Content Providers, CDNs, and Open Caching Systems. As the standard matures and gains wider adoption, it is expected that additions to this set of cache control policies will be required.¶
The FCI and MI objects defined in the present document are transferred via the interfaces defined in CDNI [RFC8006]. [RFC8006] describes how to secure these interfaces, protecting the integrity, confidentiality and ensuring the authenticity of the dCDN and uCDN. The security provide by [RFC8006] should therefore address the above security concerns.¶
The authors would like to express their gratitude to the members of the Streaming Video Technology Alliance [SVTA] Open Caching Working Group for their guidance / contribution / reviews ...)¶
Particulary the following people contribute in one or other way to the content of this draft:¶