<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 3.2.2) -->
<?rfc tocindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-nottingham-http-invalidation-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.0 -->
  <front>
    <title>An HTTP Cache Invalidation API</title>
    <seriesInfo name="Internet-Draft" value="draft-nottingham-http-invalidation-01"/>
    <author initials="M." surname="Nottingham" fullname="Mark Nottingham">
      <organization/>
      <address>
        <postal>
          <postalLine>Prahran</postalLine>
          <postalLine>Australia</postalLine>
        </postal>
        <email>mnot@mnot.net</email>
        <uri>https://www.mnot.net/</uri>
      </address>
    </author>
    <date/>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 42?>

<t>This document specifies an HTTP-based API that gateway caches (such as those in reverse proxies and content delivery networks) can expose to allow origin servers to their invalidate stored responses.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-nottingham-http-invalidation/"/>.
      </t>
      <t>
         information can be found at <eref target="https://mnot.github.io/I-D/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/mnot/I-D/labels/http-invalidation"/>.</t>
    </note>
  </front>
  <middle>
    <?line 46?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref section="4.4" sectionFormat="of" target="HTTP-CACHING"/> defines invalidation as the side effect of a state-changing request on one or more stored responses in an HTTP cache.</t>
      <t>In practice, it has become common for caches to allow invalidation to be triggered through other mechanisms -- often, using a dedicated HTTP API. This is especially useful for caches that have a relationship with the origin server and wish to offer them finer-grained control, as is the case for reverse proxies and content delivery networks.</t>
      <t>While many such APIs already exist, they are proprietary. That makes it difficult for the origin server or its delegates (for example, content management systems) to take advantage of those facilities, because each integration needs to created and maintained, hindering interoperability.</t>
      <t>This document standardises an HTTP-based API for HTTP cache invalidation. <xref target="resource"/> describes an HTTP resource that accepts requests to invalidate stored responses, using a format described in <xref target="event-format"/>.</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="resource">
      <name>HTTP Cache Invalidation Resources</name>
      <t>An HTTP Cache Invalidation Resource (hereafter, 'invalidation resource') is an HTTP resource (<xref section="3.1" sectionFormat="of" target="HTTP"/>) that has the behaviours described in this section.</t>
      <t>Invalidation resources <bcp14>SHOULD</bcp14> require requests to include some form of authentication. The specific mechanism is out of scope for this document, but note that <xref target="DESCRIPTION"/> describes a way to specify a mechanism and credentials in the description format.</t>
      <t>When an invalidation resource receives a POST request whose content is in the format described in <xref target="event-format"/>, its expected behaviour will be to process the request and invalidate the responses it indicates that are stored in the cache(s) associated with it.</t>
      <t>As described in <xref section="4.4" sectionFormat="of" target="HTTP-CACHING"/>:</t>
      <ul empty="true">
        <li>
          <t>invalidate means that the cache will either remove all stored responses whose target URI matches the given URI or mark them as "invalid" and in need of a mandatory validation before they can be sent in response to a subsequent request.</t>
        </li>
      </ul>
      <t>This includes all responses for the URI, including those who have cache keys that include information derived from the Vary response field (see <xref section="4.1" sectionFormat="of" target="HTTP-CACHING"/>).</t>
      <t>The authenticated user <bcp14>MUST</bcp14> be authorized to perform each invalidation. Unauthorized invalidations <bcp14>MUST</bcp14> be ignored; future extensions might allow description of which invalidations succeeded or failed.</t>
      <t>Furthermore, some features in the event format described in <xref target="event-format"/> are not required to be implemented; for example, some event selector types might not be supported, or the "purge" member might not be supported. An invalidation resource that receives a request using an unsupported feature <bcp14>SHOULD</bcp14> respond with a 501 (Not Implemented) status code.</t>
      <t>TODO: specify a problem details object for these errors</t>
      <t>If the cache is able to invalidate the indicated stored responses in a reasonable amount of time (for example, 30 seconds), the invalidation resource <bcp14>SHOULD</bcp14> respond with a 200 (OK) status code only once all of those responses have been invalidated.</t>
      <t>Otherwise (i.e., the cache cannot invalidate within a reasonable amount of time, or cannot estimate how long invalidation will take), it <bcp14>SHOULD</bcp14> immediately respond with a 202 (Accepted) status code.</t>
      <t>This specification does not define a format for successful responses from invalidation resources; implementations <bcp14>MAY</bcp14> send responses with empty content. Future extensions might allow description of the results of invalidation.</t>
    </section>
    <section anchor="event-format">
      <name>HTTP Cache Invalidation Event Format</name>
      <t>The HTTP Cache Invalidation Event Format (hereafter, 'event format') is a JSON-based <xref target="JSON"/> format that conveys a list of selectors that are used to identify the stored responses in a cache, along with additional instructions about the nature of invalidation being requested.</t>
      <t>Its content is an object with the following two required members:</t>
      <ul spacing="normal">
        <li>"type": a case-sensitive string indicating the selector type for the invalidation event; see <xref target="selector-types"/></li>
        <li>"selectors": an array of strings, each being a selector of the indicated type.</li>
      </ul>
      <t>For example, this document contains an event using the "URI" selector type, and invalidates two URIs:</t>
      <sourcecode type="json"><![CDATA[
{
    "type": "uri",
    "selectors": [
      "https://example.com/foo/bar",
      "https://example.com/foo/bar/baz"
    ]
}
]]></sourcecode>
      <t>Additionally, this document defines one optional member of the top-level object:</t>
      <ul spacing="normal">
        <li>"purge": a boolean that when true indicates that the selected stored responses should be removed from cache, rather than just marked as invalid.</li>
      </ul>
      <t>Support for purge is <bcp14>OPTIONAL</bcp14>. When a cache supports for purge, the cache <bcp14>MUST</bcp14> remove the relevant response(s) from volatile and non-volatile storage as promptly as possible, and if the cache indicates success with a 200 (OK) status code, <bcp14>MUST</bcp14> do so before returning the response.</t>
      <t>Unrecognised members of the top-level object <bcp14>MUST</bcp14> be ignored, to allow future updates of this specification to add new features.</t>
      <section anchor="selector-types">
        <name>Selector Types</name>
        <t>This document defines the following cache invalidation selector types:</t>
        <section anchor="uri-selector">
          <name>URI Selectors</name>
          <t>The "uri" selector type selects one or more stored responses by their URI. When the invalidation event type is "uri", the content each selector string <bcp14>MUST</bcp14> be either a URI <xref target="URI"/> or an IRI <xref target="IRI"/>.</t>
          <t>When a selector value is compared to a stored response URI to determine whether it selects that response, the following process is used:</t>
          <ol spacing="normal" type="1"><li>If the selector value is a IRI, it is converted to a URI, per <xref section="3.2" sectionFormat="of" target="IRI"/>.</li>
            <li>Syntax-based normalization is applied to both the selector and stored response URI, per <xref section="6.2.2" sectionFormat="of" target="URI"/>.</li>
            <li>Scheme-based normalization is applied to both the selector and stored response URI, per <xref section="6.2.3" sectionFormat="of" target="URI"/>.</li>
          </ol>
          <t>For example, "https://www.example.com/foo/bar" selects stored responses with the following URIs:</t>
          <ul spacing="normal">
            <li>"https://www.example.com/foo/bar"</li>
            <li>"HTTPS://www.example.com:443/foo/bar"</li>
            <li>"https://www.example.com/fo%6f/bar"</li>
            <li>"https://www.example.com/fo%6F/bar"</li>
            <li>"https://www.example.com/../foo/bar"</li>
            <li>"https://www.example.com:/foo/bar"</li>
          </ul>
          <t>... but does not select stored responses with the following URIs:</t>
          <ul spacing="normal">
            <li>"https://www.example.com/FOO/bar" (different path)</li>
            <li>"https://www.example.com/foo/bar/baz" (different path)</li>
            <li>"https://www.example.com/foo/barbaz" (different path)</li>
            <li>"https://www.example.com/foo/bar/" (different path)</li>
            <li>"http://www.example.com/foo/bar" (different scheme)</li>
            <li>"https://example.com/foo/bar" (different authority)</li>
            <li>"https://www.example.com/foo/bar?baz" (different query)</li>
            <li>"https://www.example.com/foo/bar?" (different query)</li>
            <li>"https://www.example.com:8080/foo/bar" (different authority)</li>
          </ul>
        </section>
        <section anchor="prefix-selector">
          <name>URI Prefix Selectors</name>
          <t>The "uri-prefix" selector type selects one or more stored responses by their URI prefix. When the invalidation event type is "uri-prefix", the content each selector string <bcp14>MUST</bcp14> be either a URI <xref target="URI"/> or an IRI <xref target="IRI"/>.</t>
          <t>When a selector value is compared to a stored response URI to determine whether it selects that response, the same normalization process described in <xref target="uri-selector"/> is used. However, the selector value is considered to be a prefix to match. Additionally, each segment of the selector value's path must have a matching segment in the stored response URI.</t>
          <t>For example, "https://www.example.com/foo/bar" would select all of the following URIs:</t>
          <ul spacing="normal">
            <li>"https://www.example.com/foo/bar"</li>
            <li>"https://www.example.com/foo/bar/"</li>
            <li>"https://www.example.com/foo/bar/baz"</li>
            <li>"https://www.example.com/foo/bar/baz/bat"</li>
            <li>"https://www.example.com/foo/bar?"</li>
            <li>"https://www.example.com/foo/bar?baz"</li>
          </ul>
          <t>... but does not match stored responses with the following URIs:</t>
          <ul spacing="normal">
            <li>"https://www.example.com/foo/barbaz" (last segment does not match)
ww.example.com/foo/BAR/baz" (second segment does not match)</li>
          </ul>
        </section>
        <section anchor="origin-selector">
          <name>Origin Selectors</name>
          <t>The "origin" selector type selects all stored responses associated with a URI origin (<xref section="4.3.1" sectionFormat="of" target="HTTP"/>). When the invalidation event type is "origin", the content of each selector string <bcp14>MUST</bcp14> be a normalized (using the process defined in <xref target="uri-selector"/>) URI prefix, without a trailing "/". If the port is not present, it is assumed to be the default port for the scheme.</t>
          <t>For example, all of these are origin selectors:</t>
          <ul spacing="normal">
            <li>"https://www.example.com:443"</li>
            <li>"http://example.com"</li>
            <li>"https://example.net:8080"</li>
          </ul>
        </section>
        <section anchor="group-selectors">
          <name>Group Selectors</name>
          <t>The "group" selector type selects all stored responses associated with a group on a specified origin. When the invalidation event type is "group", the content of each selector string <bcp14>MUST</bcp14> be a normalized (using the process defined in <xref target="uri-selector"/>) URI prefix with port always present, and without a trailing "/". See <xref target="origin-selector"/> for examples.</t>
          <t>Additionally, when the invalidation event type is "group", the document's root object <bcp14>MUST</bcp14> contain an additional member, "groups", whose value is an array of strings that correspond to the group(s) being invalidated, per <xref target="GROUPS"/>.</t>
          <t>For example:</t>
          <sourcecode type="json"><![CDATA[
{
    "type": "group",
    "selectors": [
      "https://example.com:443",
      "https://www.example.com:443"
    ],
    "groups": [
      "scripts"
    ]
}
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="media-types">
        <name>Media Types</name>
        <t><em>TBD</em></t>
      </section>
      <section anchor="cache-invalidation-selector-types">
        <name>Cache Invalidation Selector Types</name>
        <t><em>TBD</em></t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t><em>TBD</em></t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="HTTP">
        <front>
          <title>HTTP Semantics</title>
          <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
          <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
          <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
          <date month="June" year="2022"/>
          <abstract>
            <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
            <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="97"/>
        <seriesInfo name="RFC" value="9110"/>
        <seriesInfo name="DOI" value="10.17487/RFC9110"/>
      </reference>
      <reference anchor="HTTP-CACHING">
        <front>
          <title>HTTP Caching</title>
          <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
          <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
          <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
          <date month="June" year="2022"/>
          <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>
            <t>This document obsoletes RFC 7234.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="98"/>
        <seriesInfo name="RFC" value="9111"/>
        <seriesInfo name="DOI" value="10.17487/RFC9111"/>
      </reference>
      <reference anchor="GROUPS">
        <front>
          <title>HTTP Cache Groups</title>
          <author fullname="Mark Nottingham" initials="M." surname="Nottingham">
         </author>
          <date day="24" month="June" year="2023"/>
          <abstract>
            <t>   This specification introduces a means of describing the relationships
   between stored responses in HTTP caches, "grouping" them by
   associating a stored response with one or more opaque strings.

About This Document

   This note is to be removed before publishing as an RFC.

   Status information for this document may be found at
   https://datatracker.ietf.org/doc/draft-nottingham-http-cache-groups/.

   information can be found at https://mnot.github.io/I-D/.

   Source for this draft and an issue tracker can be found at
   https://github.com/mnot/I-D/labels/http-cache-groups.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-nottingham-http-cache-groups-00"/>
      </reference>
      <reference anchor="DESCRIPTION">
        <front>
          <title>*** BROKEN REFERENCE ***</title>
          <author>
            <organization/>
          </author>
          <date/>
        </front>
      </reference>
      <reference anchor="JSON">
        <front>
          <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
          <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
          <date month="December" year="2017"/>
          <abstract>
            <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
            <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="90"/>
        <seriesInfo name="RFC" value="8259"/>
        <seriesInfo name="DOI" value="10.17487/RFC8259"/>
      </reference>
      <reference anchor="URI">
        <front>
          <title>Uniform Resource Identifier (URI): Generic Syntax</title>
          <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
          <author fullname="R. Fielding" initials="R." surname="Fielding"/>
          <author fullname="L. Masinter" initials="L." surname="Masinter"/>
          <date month="January" year="2005"/>
          <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="IRI">
        <front>
          <title>Internationalized Resource Identifiers (IRIs)</title>
          <author fullname="M. Duerst" initials="M." surname="Duerst"/>
          <author fullname="M. Suignard" initials="M." surname="Suignard"/>
          <date month="January" year="2005"/>
          <abstract>
            <t>This document defines a new protocol element, the Internationalized Resource Identifier (IRI), as a complement of the Uniform Resource Identifier (URI). An IRI is a sequence of characters from the Universal Character Set (Unicode/ISO 10646). A mapping from IRIs to URIs is defined, which means that IRIs can be used instead of URIs, where appropriate, to identify resources.</t>
            <t>The approach of defining a new protocol element was chosen instead of extending or changing the definition of URIs. This was done in order to allow a clear distinction and to avoid incompatibilities with existing software. Guidelines are provided for the use and deployment of IRIs in various protocols, formats, and software components that currently deal with URIs.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="3987"/>
        <seriesInfo name="DOI" value="10.17487/RFC3987"/>
      </reference>
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <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="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
    </references>
    <?line 244?>

<section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Thanks to Stephen Ludin for his review and suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA9Va627bRhb+z6eYVbCoXUjyJWmbqEW7qp003k1ir+3soiiK
YESOpGkoDjtDWlEF91n2WfbJ9jtnhjdJcZy2i8UCuYjkXM71O98ccjAYRIUu
UjUS40w8v76+ECcynitxlt3IVCey0CYT44uzSE4mVt2MosTEmVxgfGLltBhk
pih0NpvLxWBeFPlAt+YNDo8i/MLY9en4+ultFONiZuxqJFyRRJHO7UgUtnTF
8eHhk8Pj6K1aLY1NRti9UDZTxeCUNokiV8gseSNTk2GxlXKRW0hbvPm5NIVy
I5GZKNcj8UNh4r7APzpLVFb0hTO2sGrq8Gu1CD8Kq2M8is0il+HHAoPxSGep
ztSPUXSjslKNIiHmhhTtkWJudHCwgLLDmS7m5WSozcHZ4PSgh1FW5aY1KgzA
ujyBh6VyolJ3sGWhXhT54QPtXKkGPG4ktsZFkSyLubEQaoAdBWSF2i+H4lVt
fr7tPfNS2rebT4ydyUz/wquN+E5uYNXU/xZiIC6snFuZ8XVsyqwgP43hHAsx
JN9WC6khHqn1FzYGXMQPSqu91GSA5XI5rJ4eRFFm7ALb3rBFKcJG4vLZyZOj
o8NwPTgZnzw/e/Vddf8I97+7PH99cYVAGJwON0MspgAdzKwpc4ehp0+vTi7P
Lq7Pzl9tjZ8h4JZyNUiUi63O2ZRC/PWKhmKzx8efPcH168szvnz45PHnuDxr
Lr+IomgwGAg5ITPEiMTruXYCOVBS0AiXq1hPtXJC+uwZTKRTCSWMKOayEEEA
wTI7sefKeC6kw0PjFLyI4LlRFj9za975dRJYH+GP1ROVwmx2JWBI5MVbt491
MqHe5TS5MEKmqVnCtXqGlZyytBTdL+ZKW1EHkELUGwuxrHK5yZxyQ6/WQidJ
qqDjA8o4a5Iy9tG2Xl8p/ikeDR8JM+346fYWkk2RKk60Y9Srhb10ooSaTrEA
zZTYHCIM4rnMIOYMQvxcKodnGf4oSC8WEG5LRDJOMKq3HmQ+y2AnuEHHCula
iDm2nChkmuI0xopTLBdsXdunIyTuTmA7mGymaL9ijjiazYWB6JBEkZjaLZyA
ecwUbuiL0pHYEkonmhAs8ULBx0PB4YA/iiMB+60wXE3LtCMJRcJc3igsYlXK
gri5zsUSuc8267iQY2Cp3ZyENTCkpTELQSa3iHuJ/32QWJP2yezaWz5G7PG+
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

-->

</rfc>
