<?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.11 (Ruby 3.2.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-wicg-http-no-vary-search-01" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.21.0 -->
  <front>
    <title>No-Vary-Search</title>
    <seriesInfo name="Internet-Draft" value="draft-wicg-http-no-vary-search-01"/>
    <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="June" day="04"/>
    <area>Applications</area>
    <workgroup>HyperText Transfer Protocol</workgroup>
    <keyword>http</keyword>
    <keyword>caching</keyword>
    <abstract>
      <?line 98?>

<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://jeremyroman.github.io/http-no-vary-search/draft-wicg-http-no-vary-search.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-wicg-http-no-vary-search/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/jeremyroman/http-no-vary-search"/>.</t>
    </note>
  </front>
  <middle>
    <?line 102?>

<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>The dictionary must only contain entries whose keys are one of <tt>key-order</tt>, <tt>params</tt>, <tt>except</tt>.</t>
        </li>
        <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>
      <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>If <em>value</em>'s keys contains anything other than "<tt>key-order</tt>", "<tt>params</tt>", or "<tt>except</tt>", 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>
        </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>
      <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 417?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
ePRZid4GhUflIFeSrt7Bdv94mbYk/BjKaYgb93U5xDw/2W0UkqZGBbwRSxEY
M8qsRnnP0A0YCq5AxzTNe2BR+guiqR+Qg74H9PX2AybOQFfHfj6mYcLFVVk0
H/h6pwJuBbxzXACASm0kPdxkPfBYGCbRiUMSZkc/PMD4CMJABNZHZjyQ4QBD
FeMt6UwjPwLPN0fOA1xhwY/sL870Ob3h/9Mx1nkqEFYlTSs60SJNdcZasVjd
mErs6pzifPSyf6xeabPKp9Zxb7uaexty5OvCfRrf3PdTu6PktpPfaKWcnMrJ
+rSV8qVRzMyyUigmZvnSJ3zPlzrha7G0CQ8WS5nwaB4ah6x9sd/pmLyTdeHd
BX3EaJeySop34fHeDAKsebR75YMPkdEYkh6Wdn9lYW1519RaNsamMaK5dCZM
NbUMCccgcS7GAcdaOiTS2zdP99jGkybloxliU8iZ8N0227g4azpl2B8IXNTL
iBiLyAUHZHtikYKyVqa1AngeedjBM9Q1PosIaIKWMHh3eWS/YOn6RIQEP7p3
+jbDpbK7bi2J+/YLg45txto9OcqhlvbtLeCXIpIxWOfvS5g6ZcF3vmiQ5asc
Nx01Vwc679bahXDmyEi3hohM7dL8KD3QpwPyTab8kR9wqr1iUE/M4lmX7NaN
PZ1ObYTGVEOrk3eP/NK0KhvQNOstinKRFE5H4z7sfvrEND0H0yfkocnriDhN
GMZ0emqHHUHMJDT/Ni3rr/BDDbIjobCHwqoMiNb3n623v3myfvjV+t72+jdf
N5o02LIojjQ5WWWKnvY55DIYQJ+i13/8nf3Pf/yNQlgHT2nFDVgXFRdoNmzg
yDAm1rschImdIKZzNj1XZV5CfgMPcYEFgkJXoSh/GkG4qHRNgxCOI4FnWioD
NqGvUQyVAPocEytsrAAWhx9ZYwGbhk5lS5ZrMOqOgPBobjZ6iANx89ZrTfIu
RFnVEE8Q4mk1hJbH+tNthHt2H1wmt93nEJgh3kpClomqTXhTqAV8QbFod/5w
/bVpXLTkitBqOHUk0qkuH+kWsUz0jm4rg4wioqM43DJychlJLwlkadFlKsFr
nR+r1XFdwq4LD9tdEiV+3OsSD7r3rp8VdMoUvqsffJ+dGy8cqudclU6s9HnJ
/NyOWOUOxQiUHnK0CLsFMcBRClvrNsEP4WnyWEYxHayNOWw46FOXqPH8fh9j
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
LEkAAA==

-->

</rfc>
