CINXE.COM
RFC 8246 - HTTP Immutable Responses
<!DOCTYPE html SYSTEM "about:legacy-compat"> <html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>RFC 8246 - HTTP Immutable Responses</title><script> function getMeta(rfcno, container) { var xhr = new XMLHttpRequest(); xhr.open("GET", "https://www.rfc-editor.org/rfc/rfc" + rfcno + ".json", true); xhr.onload = function (e) { if (xhr.readyState === 4) { if (xhr.status === 200) { var data = JSON.parse(xhr.response); var cont = document.getElementById(container); // empty the container while (cont.firstChild) { cont.removeChild(myNode.firstChild); } var c = data.status; if (c) { var bld = newElementWithText("b", c); cont.appendChild(bld); } else { cont.appendChild(newElementWithText("i", "(document status unknown)")); } c = data.updated_by; if (c && c.length > 0 && c[0] !== null && c[0].length > 0) { cont.appendChild(newElement("br")); cont.appendChild(newText("Updated by: ")); appendRfcLinks(cont, c); } c = data.obsoleted_by; if (c && c.length > 0 && c[0] !== null && c[0].length > 0) { cont.appendChild(newElement("br")); cont.appendChild(newText("Obsoleted by: ")); appendRfcLinks(cont, c); } c = data.errata_url; if (c) { cont.appendChild(newElement("br")); var link = newElementWithText("a", "errata"); link.setAttribute("href", c); var errata = newElementWithText("i", "This document has "); errata.appendChild(link); errata.appendChild(newText(".")); cont.appendChild(errata); } cont.style.display = "block"; } else { console.error(xhr.statusText); } } }; xhr.onerror = function (e) { console.error(xhr.status + " " + xhr.statusText); }; xhr.send(null); } function appendRfcLinks(parent, updates) { var template = "https://www.rfc-editor.org/rfc/rfc{rfc}.html"; for (var i = 0; i < updates.length; i++) { var rfc = updates[i].trim().toLowerCase(); if (rfc.substring(0, 3) == "rfc") { var no = parseInt(rfc.substring(3), 10); var link = newElement("a"); link.setAttribute("href", template.replace("{rfc}", no)); link.appendChild(newText(no)); parent.appendChild(link); } else { parent.appendChild(newText(rfc)); } if (i != updates.length - 1) { parent.appendChild(newText(", ")); } } } // DOM helpers function newElement(name) { return document.createElement(name); } function newElementWithText(name, txt) { var e = document.createElement(name); e.appendChild(newText(txt)); return e; } function newText(text) { return document.createTextNode(text); } </script><script> function anchorRewrite() { map = { }; if (window.location.hash.length >= 1) { var fragid = window.location.hash.substr(1); if (fragid) { if (! document.getElementById(fragid)) { var prefix = "rfc."; var mapped = map[fragid]; if (mapped) { window.location.hash = mapped; } else if (fragid.indexOf("section-") == 0) { window.location.hash = prefix + "section." + fragid.substring(8).replace("-",".p."); } else if (fragid.indexOf("appendix-") == 0) { window.location.hash = prefix + "section." + fragid.substring(9).replace("-",".p."); } else if (fragid.indexOf("s-") == 0) { var postfix = fragid.substring(2); if (postfix.startsWith("abstract")) { window.location.hash = prefix + postfix; } else if (postfix.startsWith("note-")) { window.location.hash = prefix + "note." + postfix.substring(5).replace("-",".p."); } else { window.location.hash = prefix + "section." + postfix.replace("-",".p."); } } else if (fragid.indexOf("p-") == 0) { var r = fragid.substring(2); var p = r.indexOf("-"); if (p >= 0) { window.location.hash = prefix + "section." + r.substring(0, p) + ".p." + r.substring(p + 1); } } } } } } window.addEventListener('hashchange', anchorRewrite); window.addEventListener('DOMContentLoaded', anchorRewrite); </script><meta name="viewport" content="width=device-width, initial-scale=1"><meta property="og:type" content="article"><meta property="og:title" content="RFC8246"><meta property="og:description" content="HTTP Immutable Responses"><meta property="og:url" content="https://httpwg.org/specs/rfc8246.html"><meta property="og:site_name" content="IETF HTTP Working Group Specifications"><meta property="og:image" content="https://httpwg.org/assets/favicon/apple-icon-180x180.png"><link rel="stylesheet" type="text/css" href="/assets/node_modules/bootstrap/dist/css/bootstrap.min.css"><style type="text/css"> body { padding-top: 80px; padding-bottom: 80px; position: relative; } .table.header th, .table.header td { border-top: none; padding: 0; } #sidebar { margin-top: -10px; height: 90%; overflow-y: auto; font-size: 90%; } #rfc\.meta { width: 40%; float: right } .toc ul { list-style: none; } .filename { color: rgb(119, 119, 119); font-size: 23px; font-weight: normal; height: auto; line-height: 23px; } dl { margin-left: 1em; } dl.dl-horizontal: { margin-left: 0; } dl > dt { float: left; margin-right: 1em; } dl.nohang > dt { float: none; } dl > dd { margin-bottom: .5em; } dl.compact > dd { margin-bottom: 0em; } dl > dd > dl { margin-top: 0.5em; margin-bottom: 0em; } ul.empty { list-style-type: none; } ul.empty li { margin-top: .5em; } td.reference { padding-right: 1em; vertical-align: top; } .feedback { position: fixed; bottom: 5px; right: 5px; } .fbbutton { margin-left: 5px; } h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: rgb(51, 51, 51); } span.tt { font: 11pt consolas, monospace; font-size-adjust: none; } </style><link rel="stylesheet" type="text/css" href="/assets/site.css"><link rel="Contents" href="#rfc.toc"><link rel="Author" href="#rfc.authors"><link rel="License" href="#rfc.copyrightnotice"><link rel="Chapter" title="1 Introduction" href="#rfc.section.1"><link rel="Chapter" title="2 The Immutable Cache-Control Extension" href="#rfc.section.2"><link rel="Chapter" title="3 Security Considerations" href="#rfc.section.3"><link rel="Chapter" title="4 IANA Considerations" href="#rfc.section.4"><link rel="Chapter" title="5 References" href="#rfc.section.5"><link rel="Appendix" title="Acknowledgments" href="#rfc.section.unnumbered-1"><link rel="convertedFrom" href="https://datatracker.ietf.org/doc/draft-ietf-httpbis-immutable/"><link rel="Alternate" title="Plain Text Version" href="http://www.ietf.org/rfc/rfc8246.txt"><link rel="Help" title="RFC-Editor's Status Page" href="https://www.rfc-editor.org/info/rfc8246"><meta name="viewport" content="initial-scale=1"><meta name="generator" content="https://github.com/mnot/RFCBootstrap XSLT vendor: Saxonica http://www.saxonica.com/"><link rel="schema.dcterms" href="http://purl.org/dc/terms/"><meta name="dcterms.creator" content="McManus, P."><meta name="dcterms.identifier" content="urn:ietf:rfc:8246"><meta name="dcterms.issued" content="2017-09"><meta name="dcterms.abstract" content="The immutable HTTP response Cache-Control extension allows servers to identify resources that will not be updated during their freshness lifetime. This ensures that a client never needs to revalidate a cached fresh resource to be certain it has not been modified."><meta name="dcterms.isPartOf" content="urn:issn:2070-1721"><meta name="description" content="The immutable HTTP response Cache-Control extension allows servers to identify resources that will not be updated during their freshness lifetime. This ensures that a client never needs to revalidate a cached fresh resource to be certain it has not been modified."></head><body onload="getMeta(8246,"rfc.meta");"><nav class="navbar navbar-dark bg-dark d-print-none navbar-expand-lg fixed-top ps-3 pe-3" role="navigation"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar-collapse" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <a class="navbar-brand" href="https://httpwg.org/"><img src="https://httpwg.org/assets/http.svg" height="23"></a> </div> <div class="collapse navbar-collapse" id="navbar-collapse"> <div class="navbar-nav me-auto"> <a class="nav-item ms-1 text-white" href="https://httpwg.org/specs/">📄 Documentation</a> <div class="dropdown ms-4"> <a href="#" class="nav-item dropdown-toggle text-white" data-bs-toggle="dropdown">Work in Progress</a> <ul class="dropdown-menu"><li class="dropdown-item"><a href="https://httpwg.org/http-extensions/">HTTP Extensions</a></li><li class="dropdown-item"><a href="https://github.com/httpwg/admin/issues?q=is%3Aissue+is%3Aopen+label%3Aadoption">Future Work</a></li></ul> </div> <div class="dropdown ms-4"> <a href="#" class="nav-item dropdown-toggle text-white" data-bs-toggle="dropdown">Participate</a> <ul class="dropdown-menu"><li class="dropdown-item"><a href="https://httpwg.org/about/">About the HTTP Working Group</a></li><li class="divider"></li><li class="dropdown-item"><a href="https://httpwg.org/CONTRIBUTING.html">Contribution Policy</a></li><li class="dropdown-item"><a href="http://datatracker.ietf.org/wg/httpbis/charter/">WG Charter</a></li><li class="dropdown-item"><a href="http://lists.w3.org/Archives/Public/ietf-http-wg/">Group Mailing List 📨</a></li><li class="dropdown-item"><a href="https://httpwg.org/wg-materials/">Meeting Materials</a></li><li class="dropdown-item"><a href="https://httpwg.org/admin/editors/">Document Editor Resources</a></li></ul> </div> </div> </div> </nav><div class="container" id="top"><div class="row"><div class="col-lg-4 order-last d-none d-lg-block" id="sidebar" role="navigation"><div class="navbar"><div class="navbar-brand"><a href="#top"><strong>RFC </strong>8246</a></div><br clear="all"><div class=""><div class="toc "><ul><li><a href="#rfc.section.1">1.</a> <a href="#introduction">Introduction</a><ul><li><a href="#rfc.section.1.1">1.1.</a> <a href="#notational-conventions">Notational Conventions</a></li></ul></li><li><a href="#rfc.section.2">2.</a> <a href="#the-immutable-cache-control-extension">The Immutable Cache-Control Extension</a><ul><li><a href="#rfc.section.2.1">2.1.</a> <a href="#about-intermediaries">About Intermediaries</a></li><li><a href="#rfc.section.2.2">2.2.</a> <a href="#example">Example</a></li></ul></li><li><a href="#rfc.section.3">3.</a> <a href="#security-considerations">Security Considerations</a></li><li><a href="#rfc.section.4">4.</a> <a href="#iana-considerations">IANA Considerations</a></li><li><a href="#rfc.section.5">5.</a> <a href="#rfc.references">References</a><ul><li><a href="#rfc.section.5.1">5.1.</a> <a href="#rfc.references.1">Normative References</a></li><li><a href="#rfc.section.5.2">5.2.</a> <a href="#rfc.references.2">Informative References</a></li></ul></li><li><a href="#acknowledgments">Acknowledgments</a></li><li><a href="#rfc.authors">Author's Address</a></li></ul></div></div></div></div><div class="col-lg-8 order-first main" role="main"><header><table class="table table-condensed header" id="rfc.headerblock"><tbody><tr><td class="text-left">Internet Engineering Task Force (IETF)</td><td class="text-right">P. McManus</td></tr><tr><td class="text-left">Request for Comments: 8246</td><td class="text-right">Mozilla</td></tr><tr><td class="text-left">Category: Standards Track</td><td class="text-right">September 2017</td></tr><tr><td class="text-left">ISSN: 2070-1721</td><td class="text-right"></td></tr></tbody></table><div id="rfc.title"><h1>HTTP Immutable Responses</h1></div></header><hr><h2 id="rfc.abstract"><a href="#rfc.abstract">Abstract</a></h2><div class="lead"><div id="rfc.abstract.p.1"><p>The immutable HTTP response Cache-Control extension allows servers to identify resources that will not be updated during their freshness lifetime. This ensures that a client never needs to revalidate a cached fresh resource to be certain it has not been modified.</p></div></div><aside id="rfc.meta" class="alert alert-info"></aside><section id="rfc.status"><h2><a href="#rfc.status">Status of this Memo</a></h2><div id="rfc.boilerplate.1.p.1"><p>This is an Internet Standards Track document.</p></div><div id="rfc.boilerplate.1.p.2"><p>This document is a product of the Internet Engineering Task Force (IETF). It represents the consensus of the IETF community. It has received public review and has been approved for publication by the Internet Engineering Steering Group (IESG). Further information on Internet Standards is available in <a href="https://www.rfc-editor.org/rfc/rfc7841.html#section-2">Section 2 of RFC 7841</a>.</p></div><div id="rfc.boilerplate.1.p.3"><p>Information about the current status of this document, any errata, and how to provide feedback on it may be obtained at <a href="https://www.rfc-editor.org/info/rfc8246">https://www.rfc-editor.org/info/rfc8246</a>.</p></div></section><section id="rfc.copyrightnotice"><h2><a href="#rfc.copyrightnotice">Copyright Notice</a></h2><div id="rfc.boilerplate.2.p.1"><p>Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved.</p></div><div id="rfc.boilerplate.2.p.2"><p>This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (<a href="https://trustee.ietf.org/license-info">https://trustee.ietf.org/license-info</a>) 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 Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.</p></div></section><div class="toc d-lg-none"><ul><li><a href="#rfc.section.1">1.</a> <a href="#introduction">Introduction</a><ul><li><a href="#rfc.section.1.1">1.1.</a> <a href="#notational-conventions">Notational Conventions</a></li></ul></li><li><a href="#rfc.section.2">2.</a> <a href="#the-immutable-cache-control-extension">The Immutable Cache-Control Extension</a><ul><li><a href="#rfc.section.2.1">2.1.</a> <a href="#about-intermediaries">About Intermediaries</a></li><li><a href="#rfc.section.2.2">2.2.</a> <a href="#example">Example</a></li></ul></li><li><a href="#rfc.section.3">3.</a> <a href="#security-considerations">Security Considerations</a></li><li><a href="#rfc.section.4">4.</a> <a href="#iana-considerations">IANA Considerations</a></li><li><a href="#rfc.section.5">5.</a> <a href="#rfc.references">References</a><ul><li><a href="#rfc.section.5.1">5.1.</a> <a href="#rfc.references.1">Normative References</a></li><li><a href="#rfc.section.5.2">5.2.</a> <a href="#rfc.references.2">Informative References</a></li></ul></li><li><a href="#acknowledgments">Acknowledgments</a></li><li><a href="#rfc.authors">Author's Address</a></li></ul></div><hr class="hidden-print"><section id="introduction"><h2 id="rfc.section.1" class="np"><a href="#rfc.section.1">1.</a> <a href="#introduction">Introduction</a></h2><div id="rfc.section.1.p.1"><p>HTTP’s freshness lifetime mechanism <a href="#RFC7234"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Caching">[RFC7234]</cite></a> allows a client to safely reuse a stored response to satisfy future requests for a specified period of time. However, it is still possible that the resource will be modified during that period.</p></div><div id="rfc.section.1.p.2"><p>For instance, a front-page newspaper photo with a freshness lifetime of one hour would mean that no user would see a cached photo more than one hour old. However, the photo could be updated at any time, resulting in different users seeing different photos depending on the contents of their caches for up to one hour. This is compliant with the caching mechanism defined in <a href="#RFC7234"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Caching">[RFC7234]</cite></a>.</p></div><div id="rfc.section.1.p.3"><p>Users that need to confirm there have been no updates to their cached responses typically use the reload (or refresh) mechanism in their user agents. This in turn generates a conditional request <a href="#RFC7232"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[RFC7232]</cite></a>, and either a new representation or, if unmodified, a 304 (Not Modified) response <a href="#RFC7232"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests">[RFC7232]</cite></a> is returned. A user agent that understands HTML and fetches its dependent sub-resources might issue hundreds of conditional requests to refresh all portions of a common page <a href="#REQPERPAGE"><cite title="Total Requests per Page">[REQPERPAGE]</cite></a>.</p></div><div id="rfc.section.1.p.4"><p>However, some content providers never create more than one variant of a sub-resource, because they use “versioned” URLs. When these resources need an update, they are simply published under a new URL, typically embedding an identifier unique to that version of the resource in the path, and references to the sub-resource are updated with the new path information.</p></div><div id="rfc.section.1.p.5"><p>For example, <span class="tt">https://www.example.com/101016/main.css</span> might be updated and republished as <span class="tt">https://www.example.com/102026/main.css</span>, with any links that reference it being changed at the same time. This design pattern allows a very large freshness lifetime to be used for the sub-resource without guessing when it will be updated in the future.</p></div><div id="rfc.section.1.p.6"><p>Unfortunately, the user agent does not know when this versioned URL design pattern is used. As a result, user-driven refreshes still translate into wasted conditional requests for each sub-resource as each will return 304 responses.</p></div><div id="rfc.section.1.p.7"><p>The immutable HTTP response Cache-Control extension allows servers to identify responses that will not be updated during their freshness lifetimes.</p></div><div id="rfc.section.1.p.8"><p>This effectively informs clients that any conditional request for that response can be safely skipped without worrying that it has been updated.</p></div><section id="notational-conventions"><h3 id="rfc.section.1.1"><a href="#rfc.section.1.1">1.1.</a> <a href="#notational-conventions">Notational Conventions</a></h3><div id="rfc.section.1.1.p.1"><p>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in BCP 14 <a href="#RFC2119"><cite title="Key words for use in RFCs to Indicate Requirement Levels">[RFC2119]</cite></a> <a href="#RFC8174"><cite title="Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words">[RFC8174]</cite></a> when, and only when, they appear in all capitals, as shown here.</p></div></section></section><hr class="hidden-print"><section id="the-immutable-cache-control-extension"><h2 id="rfc.section.2" class="np"><a href="#rfc.section.2">2.</a> <a href="#the-immutable-cache-control-extension">The Immutable Cache-Control Extension</a></h2><div id="rfc.section.2.p.1"><p>When present in an HTTP response, the immutable Cache-Control extension indicates that the origin server will not update the representation of that resource during the freshness lifetime of the response.</p></div><div id="rfc.section.2.p.2"><p>Clients SHOULD NOT issue a conditional request during the response’s freshness lifetime (e.g., upon a reload) unless explicitly overridden by the user (e.g., a force reload).</p></div><div id="rfc.section.2.p.3"><p>The immutable extension only applies during the freshness lifetime of the stored response. Stale responses SHOULD be revalidated as they normally would be in the absence of the immutable extension.</p></div><div id="rfc.section.2.p.4"><p>The immutable extension takes no arguments. If any arguments are present, they have no meaning and MUST be ignored. Multiple instances of the immutable extension are equivalent to one instance. The presence of an immutable Cache-Control extension in a request has no effect.</p></div><section id="about-intermediaries"><h3 id="rfc.section.2.1"><a href="#rfc.section.2.1">2.1.</a> <a href="#about-intermediaries">About Intermediaries</a></h3><div id="rfc.section.2.1.p.1"><p>An immutable response has the same semantic meaning when received by proxy clients as it does when received by user-agent-based clients. Therefore, proxies SHOULD skip conditionally revalidating fresh responses containing the immutable extension unless there is a signal from the client that a validation is necessary (e.g., a no-cache Cache-Control request directive defined in <a href="https://www.rfc-editor.org/rfc/rfc7234.html#section-5.2.1.4">Section 5.2.1.4</a> of <a href="#RFC7234"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Caching">[RFC7234]</cite></a>).</p></div><div id="rfc.section.2.1.p.2"><p>A proxy that uses the immutable extension to bypass a conditional revalidation can choose whether to reply with a 304 or 200 response to its requesting client based on the request headers the proxy received.</p></div></section><section id="example"><h3 id="rfc.section.2.2"><a href="#rfc.section.2.2">2.2.</a> <a href="#example">Example</a></h3><div id="rfc.figure.u.1"><div><pre class="text"> Cache-Control: max-age=31536000, immutable </pre></div></div></section></section><hr class="hidden-print"><section id="security-considerations"><h2 id="rfc.section.3" class="np"><a href="#rfc.section.3">3.</a> <a href="#security-considerations">Security Considerations</a></h2><div id="rfc.section.3.p.1" class="avoidbreakafter"><p>The immutable mechanism acts as form of soft pinning and, as with all pinning mechanisms, creates a vector for amplification of cache corruption incidents. These incidents include cache-poisoning attacks. Three mechanisms are suggested for mitigation of this risk:</p></div><div id="rfc.section.3.p.2"><ul><li>Clients SHOULD ignore the immutable extension from resources that are not part of an authenticated context such as HTTPS. Authenticated resources are less vulnerable to cache poisoning.</li><li>User agents often provide two different refresh mechanisms: reload and some form of force-reload. The latter is used to rectify interrupted loads and other corruption. These reloads, typically indicated through no-cache request attributes, SHOULD ignore the immutable extension as well.</li><li>Clients SHOULD ignore the immutable extension for resources that do not provide a strong indication that the stored response size is the correct response size such as responses delimited by connection close.</li></ul></div></section><hr class="hidden-print"><section id="iana-considerations"><h2 id="rfc.section.4" class="np"><a href="#rfc.section.4">4.</a> <a href="#iana-considerations">IANA Considerations</a></h2><div id="rfc.section.4.p.1"><p>The immutable extension has been registered in the “Hypertext Transfer Protocol (HTTP) Cache Directive Registry” per the guidelines described in <a href="https://www.rfc-editor.org/rfc/rfc7234.html#section-7.1">Section 7.1</a> of <a href="#RFC7234"><cite title="Hypertext Transfer Protocol (HTTP/1.1): Caching">[RFC7234]</cite></a>.</p></div><div id="rfc.section.4.p.2"><ul><li>Cache Directive: immutable</li><li>Reference: RFC 8246</li></ul></div></section><hr class="hidden-print"><section id="rfc.references" class="np"><h2 id="rfc.section.5"><a href="#rfc.section.5">5.</a> References</h2><section class="np"><div id="rfc.references.1"><h3 id="rfc.section.5.1"><a href="#rfc.section.5.1">5.1.</a> Normative References</h3><dl class="dl-horizontal"><dt id="RFC2119">[<a href="#RFC2119" class="smpl">RFC2119</a>]</dt><dd>Bradner, S., “<a href="https://www.rfc-editor.org/rfc/rfc2119.html">Key words for use in RFCs to Indicate Requirement Levels</a>”, <a href="https://www.rfc-editor.org/info/bcp14">BCP 14</a>, RFC 2119, <a href="https://dx.doi.org/10.17487/RFC2119">DOI 10.17487/RFC2119</a>, March 1997, <<a href="https://www.rfc-editor.org/info/rfc2119">https://www.rfc-editor.org/info/rfc2119</a>>.</dd><dt id="RFC7232">[<a href="#RFC7232" class="smpl">RFC7232</a>]</dt><dd>Fielding, R., Ed. and J. Reschke, Ed., “<a href="https://www.rfc-editor.org/rfc/rfc7232.html">Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</a>”, RFC 7232, <a href="https://dx.doi.org/10.17487/RFC7232">DOI 10.17487/RFC7232</a>, June 2014, <<a href="https://www.rfc-editor.org/info/rfc7232">https://www.rfc-editor.org/info/rfc7232</a>>.</dd><dt id="RFC7234">[<a href="#RFC7234" class="smpl">RFC7234</a>]</dt><dd>Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., “<a href="https://www.rfc-editor.org/rfc/rfc7234.html">Hypertext Transfer Protocol (HTTP/1.1): Caching</a>”, RFC 7234, <a href="https://dx.doi.org/10.17487/RFC7234">DOI 10.17487/RFC7234</a>, June 2014, <<a href="https://www.rfc-editor.org/info/rfc7234">https://www.rfc-editor.org/info/rfc7234</a>>.</dd><dt id="RFC8174">[<a href="#RFC8174" class="smpl">RFC8174</a>]</dt><dd>Leiba, B., “<a href="https://www.rfc-editor.org/rfc/rfc8174.html">Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</a>”, <a href="https://www.rfc-editor.org/info/bcp14">BCP 14</a>, RFC 8174, <a href="https://dx.doi.org/10.17487/RFC8174">DOI 10.17487/RFC8174</a>, May 2017, <<a href="https://www.rfc-editor.org/info/rfc8174">https://www.rfc-editor.org/info/rfc8174</a>>.</dd></dl></div></section><section><div id="rfc.references.2"><h3 id="rfc.section.5.2"><a href="#rfc.section.5.2">5.2.</a> Informative References</h3><dl class="dl-horizontal"><dt id="REQPERPAGE">[<a href="#REQPERPAGE" class="smpl">REQPERPAGE</a>]</dt><dd>HTTP Archive, “<a href="http://httparchive.org/interesting.php#reqTotal">Total Requests per Page</a>”, <<a href="http://httparchive.org/interesting.php#reqTotal">http://httparchive.org/interesting.php#reqTotal</a>>.</dd></dl></div></section></section><hr class="hidden-print"><section id="acknowledgments"><h2 id="rfc.section.unnumbered-1" class="np"><a href="#acknowledgments">Acknowledgments</a></h2><div id="rfc.section.unnumbered-1.p.1"><p>Thank you to Ben Maurer for partnership in developing and testing this idea. Thank you to Amos Jeffries for help with proxy interactions and to Mark Nottingham for help with the documentation.</p></div></section><hr class="hidden-print"><section id="rfc.authors" class="np"><h2><a href="#rfc.authors">Author's Address</a></h2><address><b>Patrick McManus</b><br>Mozilla<br>EMail: <a href="mailto:mcmanus@ducksong.com">mcmanus@ducksong.com</a></address></section></div></div></div><script src="/assets/node_modules/jquery/dist/jquery.min.js"></script><script src="/assets/node_modules/bootstrap/dist/js/bootstrap.min.js"></script></body></html>