<?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.7.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-httpbis-no-vary-search-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title>No-Vary-Search</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-no-vary-search-00"/>
    <author fullname="Domenic Denicola">
      <organization>Google LLC</organization>
      <address>
        <email>d@domenic.me</email>
      </address>
    </author>
    <author fullname="Jeremy Roman">
      <organization>Google LLC</organization>
      <address>
        <email>jbroman@chromium.org</email>
      </address>
    </author>
    <date year="2024" month="September" day="27"/>
    <area>Applications</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 104?>

<t>A proposed HTTP header field for changing how URL search parameters impact caching.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://httpwg.org/http-extensions/draft-ietf-httpbis-no-vary-search.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-httpbis-no-vary-search/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
        Working Group information can be found at <eref target="https://httpwg.org/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/httpwg/http-extensions/labels/no-vary-search"/>.</t>
    </note>
  </front>
  <middle>
    <?line 108?>

<section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</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?>

<t>This document also adopts some conventions and notation typical in WHATWG and W3C usage, especially as it relates to algorithms. See <xref target="WHATWG-INFRA"/>.</t>
    </section>
    <section anchor="http-header-field-definition">
      <name>HTTP header field definition</name>
      <t>The <tt>No-Vary-Search</tt> HTTP header field is a structured field <xref target="STRUCTURED-FIELDS"/> whose value must be a dictionary (<xref section="3.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
      <!--
TODO: probably give some more introductory non-normative text. Look at what other HTTP field defintions do.
-->

<t>It has the following authoring conformance requirements:</t>
      <ul spacing="normal">
        <li>
          <t>If present, the <tt>key-order</tt> entry's value must be a boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>params</tt> entry's value must be either a boolean (<xref section="3.3.6" sectionFormat="of" target="STRUCTURED-FIELDS"/>) or an inner list (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>If present, the <tt>except</tt> entry's value must be an inner list (<xref section="3.1.1" sectionFormat="of" target="STRUCTURED-FIELDS"/>).</t>
        </li>
        <li>
          <t>The <tt>except</tt> entry must only be present if the <tt>params</tt> entry is also present, and the <tt>params</tt> entry's value is the boolean value true.</t>
        </li>
      </ul>
      <t>The dictionary may contain entries whose keys are not one of <tt>key-order</tt>, <tt>params</tt>, and <tt>except</tt>, but their meaning is not defined by this specification. Implementations of this specification will ignore such entries (but future documents may assign meaning to such entries).</t>
      <aside>
        <t>As always, the authoring conformance requirements are not binding on implementations. Implementations instead need to implement the processing model given by the <iref item="obtain a URL search variance"/><xref target="obtain-a-url-search-variance" format="none">obtain a URL search variance</xref> algorithm (<xref target="obtain-a-url-search-variance"/>).</t>
      </aside>
    </section>
    <section anchor="data-model">
      <name>Data model</name>
      <t>A <em>URL search variance</em> consists of the following:</t>
      <dl newline="true">
        <dt>no-vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary params</dt>
        <dd>
          <t>either the special value <strong>wildcard</strong> or a list of strings</t>
        </dd>
        <dt>vary on key order</dt>
        <dd>
          <t>a boolean</t>
        </dd>
      </dl>
      <t><iref item="default URL search variance" primary="true"/>
The <em><iref item="default URL search variance"/>default URL search variance</em> is a URL search variance whose no-vary params is an empty list, vary params is <strong>wildcard</strong>, and vary on key order is true.</t>
      <t>The <iref item="obtain a URL search variance"/><xref target="obtain-a-url-search-variance" format="none">obtain a URL search variance</xref> algorithm (<xref target="obtain-a-url-search-variance"/>) ensures that all URL search variances obey the following constraints:</t>
      <ul spacing="normal">
        <li>
          <t>vary params is a list if and only if the no-vary params is <strong>wildcard</strong>; and</t>
        </li>
        <li>
          <t>no-vary params is a list if and only if the vary params is <strong>wildcard</strong>.</t>
        </li>
      </ul>
    </section>
    <section anchor="parsing">
      <name>Parsing</name>
      <section anchor="parse-a-url-search-variance">
        <name>Parse a URL search variance</name>
        <t><iref item="parse a URL search variance" primary="true"/>
To <em><iref item="parse a URL search variance"/><xref target="parse-a-url-search-variance" format="none">parse a URL search variance</xref></em> given <em>value</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>If <em>value</em> is null, then return the <iref item="default URL search variance"/>default URL search variance.</t>
          </li>
          <li>
            <t>Let <em>result</em> be a new URL search variance.</t>
          </li>
          <li>
            <t>Set <em>result</em>'s vary on key order to true.</t>
          </li>
          <li>
            <t>If <em>value</em>["<tt>key-order</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>key-order</tt>"] is not a boolean, then return the <iref item="default URL search variance"/>default URL search variance.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary on key order to the boolean negation of <em>value</em>["<tt>key-order</tt>"].</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If <em>value</em>["<tt>params</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>params</tt>"] is a boolean:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If <em>value</em>["<tt>params</tt>"] is true, then:
                    </t>
                    <ol spacing="normal" type="1"><li>
                        <t>Set <em>result</em>'s no-vary params to <strong>wildcard</strong>.</t>
                      </li>
                      <li>
                        <t>Set <em>result</em>'s vary params to the empty list.</t>
                      </li>
                    </ol>
                  </li>
                  <li>
                    <t>Otherwise:
                    </t>
                    <ol spacing="normal" type="1"><li>
                        <t>Set <em>result</em>'s no-vary params to the empty list.</t>
                      </li>
                      <li>
                        <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
                      </li>
                    </ol>
                  </li>
                </ol>
              </li>
              <li>
                <t>Otherwise, if <em>value</em>["<tt>params</tt>"] is an array:
                </t>
                <ol spacing="normal" type="1"><li>
                    <t>If any item in <em>value</em>["<tt>params</tt>"] is not a string, then return the <iref item="default URL search variance"/>default URL search variance.</t>
                  </li>
                  <li>
                    <t>Set <em>result</em>'s no-vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>value</em>["<tt>params</tt>"].</t>
                  </li>
                  <li>
                    <t>Set <em>result</em>'s vary params to <strong>wildcard</strong>.</t>
                  </li>
                </ol>
              </li>
              <li>
                <t>Otherwise, return the <iref item="default URL search variance"/>default URL search variance.</t>
              </li>
            </ol>
          </li>
          <li>
            <t>If <em>value</em>["<tt>except</tt>"] exists:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>If <em>value</em>["<tt>params</tt>"] is not true, then return the <iref item="default URL search variance"/>default URL search variance.</t>
              </li>
              <li>
                <t>If <em>value</em>["<tt>except</tt>"] is not an array, then return the <iref item="default URL search variance"/>default URL search variance.</t>
              </li>
              <li>
                <t>If any item in <em>value</em>["<tt>except</tt>"] is not a string, then return the <iref item="default URL search variance"/>default URL search variance.</t>
              </li>
              <li>
                <t>Set <em>result</em>'s vary params to the result of applying <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> (<xref target="parse-a-key"/>) to each item in <em>value</em>["<tt>except</tt>"].</t>
              </li>
            </ol>
          </li>
          <li>
            <t>Return <em>result</em>.</t>
          </li>
        </ol>
        <aside>
          <t>In general, this algorithm is strict and tends to return the <iref item="default URL search variance"/>default URL search variance whenever it sees something it doesn't recognize. This is because the <iref item="default URL search variance"/>default URL search variance behavior will just cause fewer cache hits, which is an acceptable fallback behavior.</t>
          <t>However, unrecognized keys at the top level are ignored, to make it easier to extend this specification in the future. To avoid misbehavior with existing client software, such extensions will likely expand, rather than reduce, the set of requests that a cached response can match.</t>
        </aside>
        <aside>
          <t>The input to this algorithm is generally obtained by parsing a structured field (<xref section="4.2" sectionFormat="of" target="STRUCTURED-FIELDS"/>) using field_type "dictionary".</t>
        </aside>
      </section>
      <section anchor="obtain-a-url-search-variance">
        <name>Obtain a URL search variance</name>
        <t><iref item="obtain a URL search variance" primary="true"/>
To <em><iref item="obtain a URL search variance"/><xref target="obtain-a-url-search-variance" format="none">obtain a URL search variance</xref></em> given a <eref target="https://fetch.spec.whatwg.org/#concept-response">response</eref> <em>response</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>fieldValue</em> be the result of <eref target="https://fetch.spec.whatwg.org/#concept-header-list-get-structured-header">getting a structured field value</eref> <xref target="FETCH"/> given `<tt>No-Vary-Search</tt>` and "<tt>dictionary</tt>" from <em>response</em>'s header list.</t>
          </li>
          <li>
            <t>Return the result of parsing a URL search variance (<xref target="parse-a-url-search-variance"/>) given <em>fieldValue</em>. <iref item="parse a URL search variance"/></t>
          </li>
        </ol>
        <section anchor="examples">
          <name>Examples</name>
          <t>The following illustrates how various inputs are parsed, in terms of their impacting on the resulting no-vary params and vary params:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Result</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: (empty list)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=("a")</tt></td>
                <td align="left">no-vary params: « "<tt>a</tt>" »<br/>vary params: <strong>wildcard</strong></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params, except=("x")</tt></td>
                <td align="left">no-vary params: <strong>wildcard</strong><br/>vary params: « "<tt>x</tt>" »</td>
              </tr>
            </tbody>
          </table>
          <t>The following inputs are all invalid and will cause the <iref item="default URL search variance"/>default URL search variance to be returned:</t>
          <ul spacing="compact">
            <li>
              <t><tt>No-Vary-Search: unknown-key</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: key-order="not a boolean"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params="not a boolean or inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=("a"), except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=(), except=()</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params=?0, except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params, except=(not-a-string)</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params, except="not an inner list"</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: params, except=?1</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=("x")</tt></t>
            </li>
            <li>
              <t><tt>No-Vary-Search: except=()</tt></t>
            </li>
          </ul>
          <t>The following inputs are valid, but somewhat unconventional. They are shown alongside their more conventional form.</t>
          <table>
            <thead>
              <tr>
                <th align="left">Input</th>
                <th align="left">Conventional form</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?1</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: params</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?1</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: key-order</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params, key-order, except=("x")</tt></td>
                <td align="left">
                  <tt>No-Vary-Search: key-order, params, except=("x")</tt></td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=?0</tt></td>
                <td align="left">(omit the header)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: params=()</tt></td>
                <td align="left">(omit the header)</td>
              </tr>
              <tr>
                <td align="left">
                  <tt>No-Vary-Search: key-order=?0</tt></td>
                <td align="left">(omit the header)</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="parse-a-key">
        <name>Parse a key</name>
        <t><iref item="parse a key" primary="true"/>
To <em><iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref></em> given an ASCII string <em>keyString</em>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Let <em>keyBytes</em> be the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>keyString</em>.</t>
          </li>
          <li>
            <t>Replace any 0x2B (+) in <em>keyBytes</em> with 0x20 (SP).</t>
          </li>
          <li>
            <t>Let <em>keyBytesDecoded</em> be the <eref target="https://url.spec.whatwg.org/#percent-decode">percent-decoding</eref> <xref target="WHATWG-URL"/> of <em>keyBytes</em>.</t>
          </li>
          <li>
            <t>Let <em>keyStringDecoded</em> be the <eref target="https://encoding.spec.whatwg.org/#utf-8-decode-without-bom">UTF-8 decoding without BOM</eref> <xref target="WHATWG-ENCODING"/> of <em>keyBytesDecoded</em>.</t>
          </li>
          <li>
            <t>Return <em>keyStringDecoded</em>.</t>
          </li>
        </ol>
        <section anchor="examples-1">
          <name>Examples</name>
          <t>The <iref item="parse a key"/><xref target="parse-a-key" format="none">parse a key</xref> algorithm allows encoding non-ASCII key strings in the ASCII structured header format, similar to how the <eref target="https://url.spec.whatwg.org/#concept-urlencoded">application/x-www-form-urlencoded</eref> format <xref target="WHATWG-URL"/> allows encoding an entire entry list of keys and values in ASCII URL format. For example,</t>
          <sourcecode type="http-message"><![CDATA[
No-Vary-Search: params=("%C3%A9+%E6%B0%97")
]]></sourcecode>
          <t>will result in a URL search variance whose vary params are « "<tt>é 気</tt>" ». As explained in a later example, the canonicalization process during equivalence testing means this will treat as equivalent URL strings such as:</t>
          <!-- link "a later example" and "equivalence testing" -->

<ul spacing="normal">
            <li>
              <t><tt>https://example.com/?é 気=1</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?é+気=2</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9%20気=3</tt></t>
            </li>
            <li>
              <t><tt>https://example.com/?%C3%A9+%E6%B0%97=4</tt></t>
            </li>
          </ul>
          <t>and so on, since they all are <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">parsed</eref> <xref target="WHATWG-URL"/> to having the same key "<tt>é 気</tt>".</t>
        </section>
      </section>
    </section>
    <section anchor="comparing">
      <name>Comparing</name>
      <t><iref item="equivalent modulo search variance" primary="true"/>
Two <eref target="https://url.spec.whatwg.org/#concept-url">URLs</eref> <xref target="WHATWG-URL"/> <em>urlA</em> and <em>urlB</em> are <em>equivalent modulo search variance</em> given a URL search variance <em>searchVariance</em> if the following algorithm returns true:</t>
      <ol spacing="normal" type="1"><li>
          <t>If the scheme, username, password, host, port, or path of <em>urlA</em> and <em>urlB</em> differ, then return false.</t>
        </li>
        <li>
          <t>If <em>searchVariance</em> is equivalent to the <iref item="default URL search variance"/>default URL search variance, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>urlA</em>'s query equals <em>urlB</em>'s query, then return true.</t>
            </li>
            <li>
              <t>Return false.</t>
            </li>
          </ol>
          <t>
In this case, even URL pairs that might appear the same after running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> on their queries, such as <tt>https://example.com/a</tt> and <tt>https://example.com/a?</tt>, or <tt>https://example.com/foo?a=b&amp;&amp;&amp;c</tt> and <tt>https://example.com/foo?a=b&amp;c=</tt>, will be treated as inequivalent.</t>
        </li>
        <li>
          <t>Let <em>searchParamsA</em> and <em>searchParamsB</em> be empty lists.</t>
        </li>
        <li>
          <t>If <em>wrlA</em>'s query is not null, then set <em>searchParamsA</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlA</em>'s query.</t>
        </li>
        <li>
          <t>If <em>wrlB</em>'s query is not null, then set <em>searchParamsB</em> to the result of running the <eref target="https://url.spec.whatwg.org/#concept-urlencoded-parser">application/x-www-form-urlencoded parser</eref> <xref target="WHATWG-URL"/> given the <eref target="https://infra.spec.whatwg.org/#isomorphic-encode">isomorphic encoding</eref> <xref target="WHATWG-INFRA"/> of <em>urlB</em>'s query.</t>
        </li>
        <li>
          <t>If <em>searchVariance</em>'s no-vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>searchVariance</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>searchVariance</em>'s no-vary params does not contain <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Otherwise, if <em>searchVariance</em>'s vary params is a list, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Set <em>searchParamsA</em> to a list containing those items <em>pair</em> in <em>searchParamsA</em> where <em>searchVariance</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to a list containing those items <em>pair</em> in <em>searchParamsB</em> where <em>searchVariance</em>'s vary params contains <em>pair</em>[0].</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>searchVariance</em>'s vary on key order is false, then:  </t>
          <ol spacing="normal" type="1"><li>
              <t>Let <em>keyLessThan</em> be an algorithm taking as inputs two pairs (<em>keyA</em>, <em>valueA</em>) and (<em>keyB</em>, <em>valueB</em>), which returns whether <em>keyA</em> is <eref target="https://infra.spec.whatwg.org/#code-unit-less-than">code unit less than</eref> <xref target="WHATWG-INFRA"/> <em>keyB</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsA</em> to the result of sorting <em>searchParamsA</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
            <li>
              <t>Set <em>searchParamsB</em> to the result of sorting <em>searchParamsB</em> in ascending order with <em>keyLessThan</em>.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>If <em>searchParamsA</em>'s size is not equal to <em>searchParamsB</em>'s size, then return false.</t>
        </li>
        <li>
          <t>Let <em>i</em> be 0.</t>
        </li>
        <li>
          <t>While <em>i</em> &lt; <em>searchParamsA</em>'s size:  </t>
          <ol spacing="normal" type="1"><li>
              <t>If <em>searchParamsA</em>[<em>i</em>][0] does not equal <em>searchParamsB</em>[<em>i</em>][0], then return false.</t>
            </li>
            <li>
              <t>If <em>searchParamsA</em>[<em>i</em>][1] does not equal <em>searchParamsB</em>[<em>i</em>][1], then return false.</t>
            </li>
            <li>
              <t>Set <em>i</em> to <em>i</em> + 1.</t>
            </li>
          </ol>
        </li>
        <li>
          <t>Return true.</t>
        </li>
      </ol>
      <section anchor="examples-2">
        <name>Examples</name>
        <t>Due to how the application/x-www-form-urlencoded parser canonicalizes query strings, there are some cases where query strings which do not appear obviously equivalent, will end up being treated as equivalent after parsing.</t>
        <t>So, for example, given any non-default value for <tt>No-Vary-Search</tt>, such as <tt>No-Vary-Search: key-order</tt>, we will have the following equivalences:</t>
        <dl newline="true">
          <dt>
        <tt>https://example.com</tt>
            <br/>
            <tt>https://example.com/?</tt>
          </dt>
          <dd>A null query is parsed the same as an empty string</dd>
          <dt>
        <tt>https://example.com/?a=x</tt>
            <br/>
            <tt>https://example.com/?%61=%78</tt>
          </dt>
          <dd>Parsing performs percent-decoding</dd>
          <dt>
        <tt>https://example.com/?a=é</tt>
            <br/>
            <tt>https://example.com/?a=%C3%A9</tt>
          </dt>
          <dd>Parsing performs percent-decoding</dd>
          <dt>
        <tt>https://example.com/?a=%f6</tt>
            <br/>
            <tt>https://example.com/?a=%ef%bf%bd</tt>
          </dt>
          <dd>Both values are parsed as U+FFFD (�)</dd>
          <dt>
        <tt>https://example.com/?a=x&amp;&amp;&amp;&amp;</tt>
            <br/>
            <tt>https://example.com/?a=x</tt>
          </dt>
          <dd>Parsing splits on     <tt>&amp;</tt>
 and discards empty strings</dd>
          <dt>
        <tt>https://example.com/?a=</tt>
            <br/>
            <tt>https://example.com/?a</tt>
          </dt>
          <dd>Both parse as having an empty string value for     <tt>a</tt>
          </dd>
          <dt>
        <tt>https://example.com/?a=%20</tt>
            <br/>
            <tt>https://example.com/?a=+</tt>
            <br/>
            <tt>https://example.com/?a= &amp;</tt>
          </dt>
          <dd>
            <tt>+</tt>
 and     <tt>%20</tt>
 are both parsed as U+0020 SPACE</dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The main risk to be aware of is the impact of mismatched URLs. In particular, this could cause the user to see a response that was originally fetched from a URL different from the one displayed when they hovered a link, or the URL displayed in the URL bar.</t>
      <t>However, since the impact is limited to query parameters, this does not cross the relevant security boundary, which is the <eref target="https://html.spec.whatwg.org/multipage/browsers.html#concept-origin">origin</eref> <xref target="HTML"/>. (Or perhaps just the <eref target="https://url.spec.whatwg.org/#concept-url-host">host</eref>, from <eref target="https://url.spec.whatwg.org/#url-rendering-simplification">the perspective of web browser security UI</eref>. <xref target="WHATWG-URL"/>) Indeed, we have already given origins complete control over how they present the (URL, reponse body) pair, including on the client side via technology such as <eref target="https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-history-replacestate">history.replaceState()</eref> or service workers.</t>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <t>This proposal is adjacent to the highly-privacy-relevant space of <eref target="https://privacycg.github.io/nav-tracking-mitigations/#terminology">navigational tracking</eref>, which often uses query parameters to pass along user identifiers. However, we believe this proposal itself does not have privacy impacts. It does not interfere with <eref target="https://privacycg.github.io/nav-tracking-mitigations/#deployed-mitigations">existing navigational tracking mitigations</eref>, or any known future ones being contemplated. Indeed, if a page were to encode user identifiers in its URL, the only ability this proposal gives is to <em>reduce</em> such user tracking by preventing server processing of such user IDs (since the server is bypassed in favor of the cache). <xref target="NAV-TRACKING-MITIGATIONS"/></t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO IANA</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="FETCH" target="https://fetch.spec.whatwg.org/">
          <front>
            <title>Fetch Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="STRUCTURED-FIELDS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="WHATWG-ENCODING" target="https://encoding.spec.whatwg.org/">
          <front>
            <title>Encoding Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-INFRA" target="https://infra.spec.whatwg.org/">
          <front>
            <title>Infra Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <author initials="D." surname="Denicola" fullname="Domenic Denicola">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="WHATWG-URL" target="https://url.spec.whatwg.org/">
          <front>
            <title>URL Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </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>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="HTML" target="https://html.spec.whatwg.org/">
          <front>
            <title>HTML Living Standard</title>
            <author initials="A." surname="van Kesteren" fullname="Anne van Kesteren">
              <organization>Apple Inc.</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>WHATWG</annotation>
        </reference>
        <reference anchor="NAV-TRACKING-MITIGATIONS" target="https://privacycg.github.io/nav-tracking-mitigations/">
          <front>
            <title>Navigational-Tracking Mitigations</title>
            <author initials="P." surname="Snyder" fullname="Pete Snyder">
              <organization>Brave Software, Inc.</organization>
            </author>
            <author initials="J." surname="Yasskin" fullname="Jeffrey Yasskin">
              <organization>Google LLC</organization>
            </author>
            <date>n.d.</date>
          </front>
          <annotation>W3C Privacy CG</annotation>
        </reference>
      </references>
    </references>
    <?line 425?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
u5u+PG8JEdb/Aervzbg/SwAA

-->

</rfc>
