<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.2 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-httpbis-cache-digest-02" category="exp">

  <feedback xmlns='http://purl.org/net/xml2rfc/ext' template="mailto:ietf-http-wg@w3.org?subject={docname},%20%22{section}%22&amp;body=%3c{ref}%3e:"/><front>
    <title>Cache Digests for HTTP/2</title>

    <author initials="K." surname="Oku" fullname="Kazuho Oku">
      <organization>DeNA Co, Ltd.</organization>
      <address>
        <email>kazuhooku@gmail.com</email>
      </address>
    </author>
    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization></organization>
      <address>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>

    <date year="2017" month="5" day="30"/>

    <area>Applications and Real-Time</area>
    <workgroup>HTTP</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This specification defines a HTTP/2 frame type to allow clients to inform the server of their
cache’s contents. Servers can then use this to inform their choices of what to push to clients.</t>



    </abstract>


    <note title="Note to Readers">


<t>Discussion of this draft takes place on the HTTP working group mailing list 
(ietf-http-wg@w3.org), which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/">https://lists.w3.org/Archives/Public/ietf-http-wg/</eref>.</t>

<t>Working Group information can be found at <eref target="http://httpwg.github.io/">http://httpwg.github.io/</eref>; source 
code and issues list for this draft can be found at <eref target="https://github.com/httpwg/http-extensions/labels/cache-digest">https://github.com/httpwg/http-extensions/labels/cache-digest</eref>.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>HTTP/2 <xref target="RFC7540"/> allows a server to “push” synthetic request/response pairs into a client’s cache
optimistically. While there is strong interest in using this facility to improve perceived Web
browsing performance, it is sometimes counterproductive because the client might already have
cached the “pushed” response.</t>

<t>When this is the case, the bandwidth used to “push” the response is effectively wasted, and
represents opportunity cost, because it could be used by other, more relevant responses. HTTP/2
allows a stream to be cancelled by a client using a RST_STREAM frame in this situation, but there
is still at least one round trip of potentially wasted capacity even then.</t>

<t>This specification defines a HTTP/2 frame type to allow clients to inform the server of their
cache’s contents using a Golomb-Rice Coded Set <xref target="Rice"/>. Servers can then use this to inform their
choices of what to push to clients.</t>

<section anchor="notational-conventions" title="Notational Conventions">

<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”,
“RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in
<xref target="RFC2119"/>.</t>

</section>
</section>
<section anchor="the-cachedigest-frame" title="The CACHE_DIGEST Frame">

<t>The CACHE_DIGEST frame type is 0xd (decimal 13).</t>

<figure><artwork><![CDATA[
+-------------------------------+-------------------------------+
|         Origin-Len (16)       | Origin? (\*)                ...
+-------------------------------+-------------------------------+
|                   Digest-Value? (\*)                        ...
+---------------------------------------------------------------+
]]></artwork></figure>

<t>The CACHE_DIGEST frame payload has the following fields:</t>

<t><list style="hanging">
  <t hangText='Origin-Len:'>
  An unsigned, 16-bit integer indicating the length, in octets, of the Origin field.</t>
  <t hangText='Origin:'>
  A sequence of characters containing the ASCII serialization of an origin (<xref target="RFC6454"/>, Section 6.2) that the Digest-Value applies to.</t>
  <t hangText='Digest-Value:'>
  A sequence of octets containing the digest as computed in <xref target="computing"/>.</t>
</list></t>

<t>The CACHE_DIGEST frame defines the following flags:</t>

<t><list style="symbols">
  <t><spanx style="strong">RESET</spanx> (0x1): When set, indicates that any and all cache digests for the applicable origin held by the recipient MUST be considered invalid.</t>
  <t><spanx style="strong">COMPLETE</spanx> (0x2): When set, indicates that the currently valid set of cache digests held by the server constitutes a complete representation of the cache’s state regarding that origin, for the type of cached response indicated by the <spanx style="verb">STALE</spanx> flag.</t>
  <t><spanx style="strong">VALIDATORS</spanx> (0x4): When set, indicates that the <spanx style="verb">validators</spanx> boolean in <xref target="computing"/> is true.</t>
  <t><spanx style="strong">STALE</spanx> (0x8): When set, indicates that all cached responses represented in the digest-value are stale <xref target="RFC7234"/> at the point in them that the digest was generated; otherwise, all are fresh.</t>
</list></t>

<section anchor="client-behavior" title="Client Behavior">

<t>A CACHE_DIGEST frame MUST be sent from a client to a server on stream 0, and conveys a digest of
the contents of the client’s cache for the indicated origin.</t>

<t>In typical use, a client will send one or more CACHE_DIGESTs immediately after the first request on
a connection for a given origin, on the same stream, because there is usually a short period of
inactivity then, and servers can benefit most when they understand the state of the cache before
they begin pushing associated assets (e.g., CSS, JavaScript and images). Clients MAY send
CACHE_DIGEST at other times.</t>

<t>If the cache’s state is cleared, lost, or the client otherwise wishes the server to stop using
previously sent CACHE_DIGESTs, it can send a CACHE_DIGEST with the RESET flag set.</t>

<t>When generating CACHE_DIGEST, a client MUST NOT include cached responses whose URLs do not share
origins <xref target="RFC6454"/> with the indicated origin. Clients MUST NOT send CACHE_DIGEST frames on
connections that are not authoritative (as defined in <xref target="RFC7540"/>, 10.1) for the indicated origin.</t>

<t>CACHE_DIGEST allows the client to indicate whether the set of URLs used to compute the digest
represent fresh or stale stored responses, using the STALE flag. Clients MAY decide whether to only
sent CACHE_DIGEST frames representing their fresh stored responses, their stale stored responses,
or both.</t>

<t>Clients can choose to only send a subset of the suitable stored responses of each type (fresh or
stale). However, when the CACHE_DIGEST frames sent represent the complete set of stored responses
of a given type, the last such frame SHOULD have a COMPLETE flag set, to indicate to the server
that it has all relevant state of that type. Note that for the purposes of COMPLETE, responses
cached since the beginning of the connection or the last RESET flag on a CACHE_DIGEST frame need
not be included.</t>

<t>CACHE_DIGEST can be computed to include cached responses’ ETags, as indicated by the VALIDATORS
flag. This information can be used by servers to decide what kinds of responses to push to clients;
for example, a stale response that hasn’t changed could be refreshed with a 304 (Not Modified)
response; one that has changed can be replaced with a 200 (OK) response, whether the cached
response was fresh or stale.</t>

<t>CACHE_DIGEST has no defined meaning when sent from servers, and SHOULD be ignored by clients.</t>

<section anchor="computing" title="Computing the Digest-Value">

<t>Given the following inputs:</t>

<t><list style="symbols">
  <t><spanx style="verb">validators</spanx>, a boolean indicating whether validators (<xref target="RFC7232"/>) are to be included in the digest;</t>
  <t><spanx style="verb">URLs'</spanx>, an array of (string <spanx style="verb">URL</spanx>, string <spanx style="verb">ETag</spanx>) tuples, each corresponding to the Effective Request URI (<xref target="RFC7230"/>, Section 5.5) of a cached response <xref target="RFC7234"/> and its entity-tag <xref target="RFC7232"/> (if <spanx style="verb">validators</spanx> is true and if the ETag is available; otherwise, null);</t>
  <t><spanx style="verb">P</spanx>, an integer that MUST be a power of 2 smaller than 2**32, that indicates the probability of a false positive that is acceptable, expressed as <spanx style="verb">1/P</spanx>.</t>
</list></t>

<t><spanx style="verb">digest-value</spanx> can be computed using the following algorithm:</t>

<t><list style="numbers">
  <t>Let N be the count of <spanx style="verb">URLs</spanx>’ members, rounded to the nearest power of 2 smaller than 2**32.</t>
  <t>Let <spanx style="verb">hash-values</spanx> be an empty array of integers.</t>
  <t>For each (<spanx style="verb">URL</spanx>, <spanx style="verb">ETag</spanx>) in <spanx style="verb">URLs</spanx>, compute a hash value (<xref target="hash"/>) and append the result to <spanx style="verb">hash-values</spanx>.</t>
  <t>Sort <spanx style="verb">hash-values</spanx> in ascending order.</t>
  <t>Let <spanx style="verb">digest-value</spanx> be an empty array of bits.</t>
  <t>Write log base 2 of <spanx style="verb">N</spanx> to <spanx style="verb">digest-value</spanx> using 5 bits.</t>
  <t>Write log base 2 of <spanx style="verb">P</spanx> to <spanx style="verb">digest-value</spanx> using 5 bits.</t>
  <t>Let <spanx style="verb">C</spanx> be -1.</t>
  <t>For each <spanx style="verb">V</spanx> in <spanx style="verb">hash-values</spanx>:
  <list style="numbers">
      <t>If <spanx style="verb">V</spanx> is equal to <spanx style="verb">C</spanx>, continue to the next <spanx style="verb">V</spanx>.</t>
      <t>Let <spanx style="verb">D</spanx> be the result of <spanx style="verb">V - C - 1</spanx>.</t>
      <t>Let <spanx style="verb">Q</spanx> be the integer result of <spanx style="verb">D / P</spanx>.</t>
      <t>Let <spanx style="verb">R</spanx> be the result of <spanx style="verb">D modulo P</spanx>.</t>
      <t>Write <spanx style="verb">Q</spanx> ‘0’ bits to <spanx style="verb">digest-value</spanx>.</t>
      <t>Write 1 ‘1’ bit to <spanx style="verb">digest-value</spanx>.</t>
      <t>Write <spanx style="verb">R</spanx> to <spanx style="verb">digest-value</spanx> as binary, using log2(<spanx style="verb">P</spanx>) bits.</t>
      <t>Let <spanx style="verb">C</spanx> be <spanx style="verb">V</spanx></t>
    </list></t>
  <t>If the length of <spanx style="verb">digest-value</spanx> is not a multiple of 8, pad it with 0s until it is.</t>
</list></t>

</section>
<section anchor="hash" title="Computing a Hash Value">

<t>Given:</t>

<t><list style="symbols">
  <t><spanx style="verb">URL</spanx>, an array of characters</t>
  <t><spanx style="verb">ETag</spanx>, an array of characters</t>
  <t><spanx style="verb">validators</spanx>, a boolean</t>
  <t><spanx style="verb">N</spanx>, an integer</t>
  <t><spanx style="verb">P</spanx>, an integer</t>
</list></t>

<t><spanx style="verb">hash-value</spanx> can be computed using the following algorithm:</t>

<t><list style="numbers">
  <t>Let <spanx style="verb">key</spanx> be <spanx style="verb">URL</spanx> converted to an ASCII string by percent-encoding as appropriate <xref target="RFC3986"/>.</t>
  <t>If <spanx style="verb">validators</spanx> is true and <spanx style="verb">ETag</spanx> is not null:
  <list style="numbers">
      <t>Append <spanx style="verb">ETag</spanx> to <spanx style="verb">key</spanx> as an ASCII string, including both the <spanx style="verb">weak</spanx> indicator (if present) and double quotes, as per <xref target="RFC7232"/> Section 2.3.</t>
    </list></t>
  <t>Let <spanx style="verb">hash-value</spanx> be the SHA-256 message digest <xref target="RFC6234"/> of <spanx style="verb">key</spanx>, expressed as an integer.</t>
  <t>Truncate <spanx style="verb">hash-value</spanx> to log2( <spanx style="verb">N</spanx> * <spanx style="verb">P</spanx> ) bits.</t>
</list></t>

</section>
</section>
<section anchor="server-behavior" title="Server Behavior">

<t>In typical use, a server will query (as per <xref target="querying"/>) the CACHE_DIGESTs received on a given
connection to inform what it pushes to that client;</t>

<t><list style="symbols">
  <t>If a given URL has a match in a current CACHE_DIGEST with the STALE flag unset, it need not be pushed, because it is fresh in cache;</t>
  <t>If a given URL and ETag combination has a match in a current CACHE_DIGEST with the STALE flag set, the client has a stale copy in cache, and a validating response can be pushed;</t>
  <t>If a given URL has no match in any current CACHE_DIGEST, the client does not have a cached copy, and a complete response can be pushed.</t>
</list></t>

<t>Servers MAY use all CACHE_DIGESTs received for a given origin as current, as long as they do not
have the RESET flag set; a CACHE_DIGEST frame with the RESET flag set MUST clear any
previously stored CACHE_DIGESTs for its origin. Servers MUST treat an empty Digest-Value with a
RESET flag set as effectively clearing all stored digests for that origin.</t>

<t>Clients are not likely to send updates to CACHE_DIGEST over the lifetime of a connection; it is
expected that servers will separately track what cacheable responses have been sent previously on
the same connection, using that knowledge in conjunction with that provided by CACHE_DIGEST.</t>

<t>Servers MUST ignore CACHE_DIGEST frames sent on a stream other than 0.</t>

<section anchor="querying" title="Querying the Digest for a Value">

<t>Given:</t>

<t><list style="symbols">
  <t><spanx style="verb">digest-value</spanx>, an array of bits</t>
  <t><spanx style="verb">URL</spanx>, an array of characters</t>
  <t><spanx style="verb">ETag</spanx>, an array of characters</t>
  <t><spanx style="verb">validators</spanx>, a boolean</t>
</list></t>

<t>we can determine whether there is a match in the digest using the following algorithm:</t>

<t><list style="numbers">
  <t>Read the first 5 bits of <spanx style="verb">digest-value</spanx> as an integer; let <spanx style="verb">N</spanx> be two raised to the power of that value.</t>
  <t>Read the next 5 bits of <spanx style="verb">digest-value</spanx> as an integer; let <spanx style="verb">P</spanx> be two raised to the power of that value.</t>
  <t>Let <spanx style="verb">hash-value</spanx> be the result of computing a hash value (<xref target="hash"/>).</t>
  <t>Let <spanx style="verb">C</spanx> be -1.</t>
  <t>Read ‘0’ bits from <spanx style="verb">digest-value</spanx> until a ‘1’ bit is found; let <spanx style="verb">Q</spanx> be the number of ‘0’ bits. Discard the ‘1’.</t>
  <t>Read log2(<spanx style="verb">P</spanx>) bits from <spanx style="verb">digest-value</spanx> after the ‘1’ as an integer; let <spanx style="verb">R</spanx> be its value.</t>
  <t>Let <spanx style="verb">D</spanx> be <spanx style="verb">Q</spanx> * <spanx style="verb">P</spanx> + <spanx style="verb">R</spanx>.</t>
  <t>Increment <spanx style="verb">C</spanx> by <spanx style="verb">D</spanx> + 1.</t>
  <t>If <spanx style="verb">C</spanx> is equal to <spanx style="verb">hash-value</spanx>, return ‘true’.</t>
  <t>Otherwise, return to step 5 and continue processing; if no match is found before <spanx style="verb">digest-value</spanx> is exhausted, return ‘false’.</t>
</list></t>

</section>
</section>
</section>
<section anchor="the-acceptcachedigest-settings-parameter" title="The ACCEPT_CACHE_DIGEST SETTINGS Parameter">

<t>A server can notify its support for CACHE_DIGEST frame by sending the ACCEPT_CACHE_DIGEST (0x7) SETTINGS parameter.
If the server is tempted to making optimizations based on CACHE_DIGEST frames, it SHOULD send the SETTINGS parameter immediately after the connection is established.</t>

<t>The value of the parameter is a bit-field of which the following bits are defined:</t>

<t>FRESH (0x1): When set, it indicates that the server is willing to make use of a digest of freshly-cached responses.</t>

<t>STALE (0x2): When set, it indicates that the server is willing to make use of a digest of stale-cached responses.</t>

<t>Rest of the bits MUST be ignored and MUST be left unset when sending.</t>

<t>The initial value of the parameter is zero (0x0) meaning that the server is not interested in seeing a CACHE_DIGEST frame.</t>

<t>Some underlying transports allow the server’s first flight of application data to reach the client at around the same time when the client sends it’s first flight data. When such transport (e.g., TLS 1.3 <xref target="I-D.ietf-tls-tls13"/> in full-handshake mode) is used, a client can postpone sending the CACHE_DIGEST frame until it receives a ACCEPT_CACHE_DIGEST settings value.</t>

<t>When the underlying transport does not have such property (e.g., TLS 1.3 in 0-RTT mode), a client can reuse the settings value found in previous connections to that origin <xref target="RFC6454"/> to make assumptions.</t>

</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>This document registers the following entry in the Permanent Message Headers Registry, as per <xref target="RFC3864"/>:</t>

<t><list style="symbols">
  <t>Header field name: Cache-Digest</t>
  <t>Applicable protocol: http</t>
  <t>Status: experimental</t>
  <t>Author/Change controller: IESG</t>
  <t>Specification document(s): [this document]</t>
</list></t>

<t>This document registers the following entry in the HTTP/2 Frame Type Registry, as per <xref target="RFC7540"/>:</t>

<t><list style="symbols">
  <t>Frame Type: CACHE_DIGEST</t>
  <t>Code: 0xd</t>
  <t>Specification: [this document]</t>
</list></t>

<t>This document registers the following entry in the HTTP/2 Settings Registry, as per <xref target="RFC7540"/>:</t>

<t><list style="symbols">
  <t>Code: 0x7</t>
  <t>Name: ACCEPT_CACHE_DIGEST</t>
  <t>Initial Value: 0x0</t>
  <t>Reference: [this document]</t>
</list></t>

</section>
<section anchor="security-considerations" title="Security Considerations">

<t>The contents of a User Agent’s cache can be used to re-identify or “fingerprint” the user over
time, even when other identifiers (e.g., Cookies <xref target="RFC6265"/>) are cleared.</t>

<t>CACHE_DIGEST allows such cache-based fingerprinting to become passive, since it allows the server
to discover the state of the client’s cache without any visible change in server behaviour.</t>

<t>As a result, clients MUST mitigate for this threat when the user attempts to remove identifiers
(e.g., “clearing cookies”). This could be achieved in a number of ways; for example: by clearing
the cache, by changing one or both of N and P, or by adding new, synthetic entries to the digest to
change its contents.</t>

<t>TODO: discuss how effective the suggested mitigations actually would be.</t>

<t>Additionally, User Agents SHOULD NOT send CACHE_DIGEST when in “privacy mode.”</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference  anchor="RFC2119" target='http://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor="RFC3986" target='http://www.rfc-editor.org/info/rfc3986'>
<front>
<title>Uniform Resource Identifier (URI): Generic Syntax</title>
<author initials='T.' surname='Berners-Lee' fullname='T. Berners-Lee'><organization /></author>
<author initials='R.' surname='Fielding' fullname='R. Fielding'><organization /></author>
<author initials='L.' surname='Masinter' fullname='L. Masinter'><organization /></author>
<date year='2005' month='January' />
<abstract><t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='66'/>
<seriesInfo name='RFC' value='3986'/>
<seriesInfo name='DOI' value='10.17487/RFC3986'/>
</reference>



<reference  anchor="RFC6234" target='http://www.rfc-editor.org/info/rfc6234'>
<front>
<title>US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)</title>
<author initials='D.' surname='Eastlake 3rd' fullname='D. Eastlake 3rd'><organization /></author>
<author initials='T.' surname='Hansen' fullname='T. Hansen'><organization /></author>
<date year='2011' month='May' />
<abstract><t>Federal Information Processing Standard, FIPS</t></abstract>
</front>
<seriesInfo name='RFC' value='6234'/>
<seriesInfo name='DOI' value='10.17487/RFC6234'/>
</reference>



<reference  anchor="RFC6454" target='http://www.rfc-editor.org/info/rfc6454'>
<front>
<title>The Web Origin Concept</title>
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></author>
<date year='2011' month='December' />
<abstract><t>This document defines the concept of an &quot;origin&quot;, which is often used as the scope of authority or privilege by user agents.  Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites.  In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string.  It also defines an HTTP header field, named &quot;Origin&quot;, that indicates which origins are associated with an HTTP request.   [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6454'/>
<seriesInfo name='DOI' value='10.17487/RFC6454'/>
</reference>



<reference  anchor="RFC7230" target='http://www.rfc-editor.org/info/rfc7230'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the &quot;http&quot; and &quot;https&quot; Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t></abstract>
</front>
<seriesInfo name='RFC' value='7230'/>
<seriesInfo name='DOI' value='10.17487/RFC7230'/>
</reference>



<reference  anchor="RFC7232" target='http://www.rfc-editor.org/info/rfc7232'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP/1.1 conditional requests, including metadata header fields for indicating state changes, request header fields for making preconditions on such state, and rules for constructing the responses to a conditional request when one or more preconditions evaluate to false.</t></abstract>
</front>
<seriesInfo name='RFC' value='7232'/>
<seriesInfo name='DOI' value='10.17487/RFC7232'/>
</reference>



<reference  anchor="RFC7234" target='http://www.rfc-editor.org/info/rfc7234'>
<front>
<title>Hypertext Transfer Protocol (HTTP/1.1): Caching</title>
<author initials='R.' surname='Fielding' fullname='R. Fielding' role='editor'><organization /></author>
<author initials='M.' surname='Nottingham' fullname='M. Nottingham' role='editor'><organization /></author>
<author initials='J.' surname='Reschke' fullname='J. Reschke' role='editor'><organization /></author>
<date year='2014' month='June' />
<abstract><t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems.  This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t></abstract>
</front>
<seriesInfo name='RFC' value='7234'/>
<seriesInfo name='DOI' value='10.17487/RFC7234'/>
</reference>



<reference  anchor="RFC7540" target='http://www.rfc-editor.org/info/rfc7540'>
<front>
<title>Hypertext Transfer Protocol Version 2 (HTTP/2)</title>
<author initials='M.' surname='Belshe' fullname='M. Belshe'><organization /></author>
<author initials='R.' surname='Peon' fullname='R. Peon'><organization /></author>
<author initials='M.' surname='Thomson' fullname='M. Thomson' role='editor'><organization /></author>
<date year='2015' month='May' />
<abstract><t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2).  HTTP/2 enables a more efficient use of network resources and a reduced perception of latency by introducing header field compression and allowing multiple concurrent exchanges on the same connection.  It also introduces unsolicited push of representations from servers to clients.</t><t>This specification is an alternative to, but does not obsolete, the HTTP/1.1 message syntax.  HTTP's existing semantics remain unchanged.</t></abstract>
</front>
<seriesInfo name='RFC' value='7540'/>
<seriesInfo name='DOI' value='10.17487/RFC7540'/>
</reference>




    </references>

    <references title='Informative References'>





<reference  anchor="RFC4648" target='http://www.rfc-editor.org/info/rfc4648'>
<front>
<title>The Base16, Base32, and Base64 Data Encodings</title>
<author initials='S.' surname='Josefsson' fullname='S. Josefsson'><organization /></author>
<date year='2006' month='October' />
<abstract><t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes.  It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4648'/>
<seriesInfo name='DOI' value='10.17487/RFC4648'/>
</reference>



<reference  anchor="RFC5234" target='http://www.rfc-editor.org/info/rfc5234'>
<front>
<title>Augmented BNF for Syntax Specifications: ABNF</title>
<author initials='D.' surname='Crocker' fullname='D. Crocker' role='editor'><organization /></author>
<author initials='P.' surname='Overell' fullname='P. Overell'><organization /></author>
<date year='2008' month='January' />
<abstract><t>Internet technical specifications often need to define a formal syntax.  Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications.  The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power.  The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges.  This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='STD' value='68'/>
<seriesInfo name='RFC' value='5234'/>
<seriesInfo name='DOI' value='10.17487/RFC5234'/>
</reference>



<reference  anchor="RFC6265" target='http://www.rfc-editor.org/info/rfc6265'>
<front>
<title>HTTP State Management Mechanism</title>
<author initials='A.' surname='Barth' fullname='A. Barth'><organization /></author>
<date year='2011' month='April' />
<abstract><t>This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6265'/>
<seriesInfo name='DOI' value='10.17487/RFC6265'/>
</reference>


<reference anchor="Rice" >
  <front>
    <title>Adaptive variable-length coding for efficient compression of spacecraft television data</title>
    <author initials="R.F." surname="Rice" fullname="Robert F. Rice">
      <organization></organization>
    </author>
    <author initials="J." surname="Plaunt" fullname="James Plaunt">
      <organization></organization>
    </author>
    <date year="1971"/>
  </front>
  <seriesInfo name="IEEE Transactions on Communication Technology 19.6" value=""/>
</reference>




<reference anchor="I-D.ietf-tls-tls13">
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<date month='April' day='28' year='2017' />

<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-20' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-tls13-20.txt' />
</reference>


<reference anchor="Service-Workers" target="https://www.w3.org/TR/2016/WD-service-workers-1/">
  <front>
    <title>Service Workers 1</title>
    <author initials="A." surname="Russell" fullname="Alex Russell">
      <organization></organization>
    </author>
    <author initials="J." surname="Song" fullname="Jungkee Song">
      <organization></organization>
    </author>
    <author initials="J." surname="Archibald" fullname="Jake Archibald">
      <organization></organization>
    </author>
    <author initials="M." surname="Kruisselbrink" fullname="Marijn Kruisselbrink">
      <organization></organization>
    </author>
    <date year="2016" month="October"/>
  </front>
</reference>
<reference anchor="Fetch" target="https://fetch.spec.whatwg.org/">
  <front>
    <title>Fetch Standard</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>




<reference  anchor="RFC3864" target='http://www.rfc-editor.org/info/rfc3864'>
<front>
<title>Registration Procedures for Message Header Fields</title>
<author initials='G.' surname='Klyne' fullname='G. Klyne'><organization /></author>
<author initials='M.' surname='Nottingham' fullname='M. Nottingham'><organization /></author>
<author initials='J.' surname='Mogul' fullname='J. Mogul'><organization /></author>
<date year='2004' month='September' />
<abstract><t>This specification defines registration procedures for the message header fields used by Internet mail, HTTP, Netnews and other applications.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='90'/>
<seriesInfo name='RFC' value='3864'/>
<seriesInfo name='DOI' value='10.17487/RFC3864'/>
</reference>




    </references>


<section anchor="encoding-the-cachedigest-frame-as-an-http-header" title="Encoding the CACHE_DIGEST frame as an HTTP Header">

<t>On some web browsers that support Service Workers <xref target="Service-Workers"/> but not Cache Digests (yet), it is possible to achieve the benefit of using Cache Digests by emulating the frame using HTTP Headers.</t>

<t>For the sake of interoperability with such clients, this appendix defines how a CACHE_DIGEST frame can be encoded as an HTTP header named <spanx style="verb">Cache-Digest</spanx>.</t>

<t>The definition uses the Augmented Backus-Naur Form (ABNF) notation of <xref target="RFC5234"/> with the list rule extension defined in <xref target="RFC7230"/>, Appendix B.</t>

<figure><artwork type="abnf7230"><![CDATA[
  Cache-Digest  = 1#digest-entity
  digest-entity = digest-value *(OWS ";" OWS digest-flag)
  digest-value  = <Digest-Value encoded using base64url>
  digest-flag   = token
]]></artwork></figure>

<t>A Cache-Digest request header is defined as a list construct of cache-digest-entities.
Each cache-digest-entity corresponds to a CACHE_DIGEST frame.</t>

<t>Digest-Value is encoded using base64url <xref target="RFC4648"/>, Section 5.
Flags that are set are encoded as digest-flags by their names that are compared case-insensitively.</t>

<t>Origin is omitted in the header form.
The value is implied from the value of the <spanx style="verb">:authority</spanx> pseudo header.
Client MUST only send Cache-Digest headers containing digests that belong to the origin specified by the HTTP request.</t>

<t>The example below contains one digest of fresh resource and has only the <spanx style="verb">COMPLETE</spanx> flag set.</t>

<figure><artwork type="example"><![CDATA[
  Cache-Digest: AfdA; complete
]]></artwork></figure>

<t>Clients MUST associate Cache-Digest headers to every HTTP request, since Fetch <xref target="Fetch"/> - the HTTP API supported by Service Workers - does not define the order in which the issued requests will be sent to the server nor guarantees that all the requests will be transmitted using a single HTTP/2 connection.</t>

<t>Also, due to the fact that any header that is supplied to Fetch is required to be end-to-end, there is an ambiguity in what a Cache-Digest header respresents when a request is transmitted through a proxy.
The header may represent the cache state of a client or that of a proxy, depending on how the proxy handles the header.</t>

</section>
<section anchor="acknowledgements" title="Acknowledgements">

<t>Thanks to Adam Langley and Giovanni Bajo for their explorations of Golomb-coded sets. In
particular, see
<eref target="http://giovanni.bajo.it/post/47119962313/golomb-coded-sets-smaller-than-bloom-filters">http://giovanni.bajo.it/post/47119962313/golomb-coded-sets-smaller-than-bloom-filters</eref>, which
refers to sample code.</t>

<t>Thanks to Stefan Eissing for his suggestions.</t>

</section>
<section anchor="changes" title="Changes">

<section anchor="since-draft-ietf-httpbis-cache-digest-01" title="Since draft-ietf-httpbis-cache-digest-01">

<t><list style="symbols">
  <t>Added definition of the Cache-Digest header.</t>
  <t>Introduce ACCEPT_CACHE_DIGEST SETTINGS parameter.</t>
  <t>Change intended status from Standard to Experimental.</t>
</list></t>

</section>
<section anchor="since-draft-ietf-httpbis-cache-digest-00" title="Since draft-ietf-httpbis-cache-digest-00">

<t><list style="symbols">
  <t>Make the scope of a digest frame explicit and shift to stream 0.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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

-->

</rfc>

