<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-ietf-regext-rdap-x-media-type-05" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true">

<front>
<title abbrev="rdap-x">The "exts_list" Parameter for the RDAP Media Type</title><seriesInfo value="draft-ietf-regext-rdap-x-media-type-05" stream="IETF" status="standard" name="Internet-Draft"></seriesInfo>
<author initials="A." surname="Newton" fullname="Andy Newton"><organization>ICANN</organization><address><postal><street></street>
</postal><email>andy@hxr.us</email>
</address></author><author initials="J." surname="Singh" fullname="Jasdip Singh"><organization>ARIN</organization><address><postal><street></street>
</postal><email>jasdips@arin.net</email>
</address></author><date/>
<area>Applications and Real-Time Area (ART)</area>
<workgroup>Registration Protocols Extensions (regext)</workgroup>

<abstract>
<t>This document defines a new parameter for the RDAP media type that can be used to describe RDAP content
with RDAP extensions. Additionally, this document describes the usage of this parameter
with RDAP for the purposes of signalling RDAP extensions during content
negotiation.</t>
</abstract>

</front>

<middle>

<section anchor="background"><name>Background</name>
<t><xref target="RFC7480"></xref> defines the &quot;application/rdap+json&quot; media type to be used with RDAP. This
document defines a new parameter for this media type
when an RDAP extension needs to be described during HTTP content negotiation.</t>
<t>This parameter enables an RDAP
client to signal to an RDAP server the list of RDAP extensions supported by that client.
For example, an RDAP client that supports the &quot;foo&quot; extension may use this mechanism
as a signal to an RDAP server, thus allowing the server to respond with data using the &quot;foo&quot;
extension inside an RDAP response only when it can be assured the client can understand the extension.</t>
<t>By using this method, there is no need for every RDAP extension to define their own unique
signaling mechanism. Additionally, this method is designed to be backwards-compatible
with the deployed RDAP ecosystem (see <xref target="design_considerations"></xref> for further information).</t>

<section anchor="document-terms"><name>Document Terms</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;,
&quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174"></xref> when, and only when, they
appear in all capitals, as shown here.</t>
</section>
</section>

<section anchor="parameter"><name>The RDAP Media Type With &quot;exts_list&quot; Parameter</name>
<t>The RDAP media type, &quot;application/rdap+json&quot;, may have an optional parameter named &quot;exts_list&quot;.
This parameter is a whitespace-separated list of RDAP
extension identifiers (as would be found in the &quot;rdapConformance&quot; array).</t>
<t>Here is an example:</t>

<artwork><![CDATA[application/rdap+json;exts_list="rdap_level_0 exts fred"
]]></artwork>
</section>

<section anchor="using"><name>Using The &quot;exts_list&quot; Parameter</name>
<t><xref target="RFC7480"></xref> specifies the usage of &quot;application/json&quot;, &quot;application/rdap+json&quot; or
both with HTTP &quot;accept&quot; header. The &quot;exts_list&quot; parameter may only be used with
the &quot;application/rdap+json&quot; media type.</t>
<t>This is an example of the &quot;accept&quot; header using the RDAP media type with the &quot;exts_list&quot; parameter:</t>

<artwork><![CDATA[accept: application/json;q=0.9, 
    application/rdap+json;exts_list="rdap_level_0 exts fred";q=1
]]></artwork>
<t>If both a client and a server support the &quot;exts_list&quot; parameter, and the client requests
an extension that is unimplemented by the server, the server MUST respond with
only extensions included in the response by the server. This behavior is backwards-compatible as
RDAP clients should ignore unknown RDAP extensions as specified by <xref target="RFC9083"></xref>.
Responding with an HTTP 406 Not Acceptable status code is NOT RECOMMENDED
because an RDAP client could interpret this status code to mean that the server does not
understand RDAP in its entirety.</t>
<t>The extensions requested by the client represent a hint for the server in determining the extensions to include the response.
If a server is required to use an extension in a response that was not requested by the client, the server MUST respond as if the client had requested the extension.
This behavior is backwards-compatible as RDAP clients should ignore unknown
extensions as specified by <xref target="RFC9083"></xref>. Responding with an HTTP 406 Not Acceptable status
code is NOT RECOMMENDED for the reason stated above.</t>
<t>When the &quot;exts_list&quot; parameter is used in the RDAP media type in the &quot;content-type&quot; header, the
values in the media type's &quot;exts_list&quot; parameter MUST match the values in the &quot;rdapConformance&quot;
array in the returned JSON. However, implementation experience has shown that some HTTP
server libraries do not support modification of the &quot;content-type&quot; header per query type.
Therefore, use of the &quot;exts_list&quot; parameter with the media type of the &quot;content-type&quot; header
is NOT REQUIRED. That is, when used in the &quot;content-type&quot; header, the values of the &quot;exts_list&quot;
parameter must match that of the &quot;rdapConformance&quot; array but server may opt to omit the
&quot;exts_list&quot; parameter from the media type in the &quot;content-type&quot; header.</t>
<t>If a server does use the &quot;exts_list&quot; parameter with the media type in the &quot;content-type&quot; header,
the content of the &quot;exts_list&quot; parameter MUST mirror the content of the
&quot;rdapConformance&quot; array in server responses. This includes the identifier &quot;rdap_level_0&quot;, which is not
an extension identifier but an identifier for the base RDAP specifications. Servers MUST
follow the same rules for placing &quot;rdap_level_0&quot; in the content of the &quot;exts_list&quot;
parameter and the &quot;rdapConformance&quot; array. Clients MUST interpret the &quot;exts_list&quot;
parameter without &quot;rdap_level_0&quot; or one of its successor identifiers (e.g., &quot;rdap_level_1&quot;)
in the same manner as the interpretation of the &quot;rdapConformance&quot; array without
&quot;rdap_level_0&quot; or one of its successors.</t>
<t>Nothing in this specification sidesteps or obviates the HTTP content negotiation defined
in <xref target="RFC9110"></xref> for RDAP.</t>
<t>Likewise, nothing in this specification sidesteps or obviates the HTTP caching mechanisms
defined in <xref target="RFC9110"></xref>. Further advice on the &quot;vary&quot; header can be found in <xref target="vary_header"></xref>.</t>
<t>Some RDAP extensions, such as <xref target="RFC9560"></xref>, have other protocol elements (e.g., extension-specific query parameters)
passed from the client to the server, and the presence of these protocol elements may be
used by servers to determine a client's capability to handle the related RDAP extension(s). This specification
does not require the usage of those extension identifiers in the &quot;exts_list&quot; parameter,
though clients SHOULD list the extension identifier in the &quot;exts_list&quot; parameter when using
other protocol elements of those extensions for better compatibility with servers
recognizing the &quot;exts_list&quot; parameter. Servers SHOULD NOT require the usage of extension
identifiers in the &quot;exts_list&quot; parameter when these types of extension protocol elements
are present in requests for better compatibility with the extensions using them.</t>

<section anchor="extension-identifier"><name>Extension Identifier</name>
<t>This document defines an RDAP extension using the identifier &quot;exts&quot;.
This RDAP extension defines no additional RDAP queries or response structures.</t>
<t>The purpose of this RDAP extension is to allow servers to signal support for the &quot;exts_list&quot; parameter in
&quot;rdapConformance&quot; arrays of responses to &quot;/help&quot; (aka &quot;service discovery&quot;).</t>
</section>

<section anchor="examples"><name>Examples</name>
<t>The following examples use the HTTP/1.1 message exchange syntax as seen in <xref target="RFC9110"></xref>.</t>

<section anchor="classic-negotiation"><name>Classic Negotiation</name>
<t>This example demonstrates the negotiation of the &quot;application/rdap+json&quot; media type
as defined in <xref target="RFC7480"></xref> using an RDAP &quot;/help&quot; query. This example also demonstrates
the negotiation in which a client does not support the &quot;exts&quot; extension, but a server does support
the &quot;exts&quot; extension.</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /help HTTP/1.1
accept: application/rdap+json
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{ "rdapConformance" : [ "rdap_level_0", "exts" ],
  "notices" : [
    { "description" : [ "my content includes a trailing CRLF" ] } ] }
]]></artwork>
</section>

<section anchor="negotiation-of-an-rdap-extension"><name>Negotiation of an RDAP Extension</name>
<t>In this example, both the client and server support the &quot;exts&quot; extension and a fictional
extension of &quot;foo&quot;.</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /help HTTP/1.1
accept: application/rdap+json;exts_list="rdap_level_0 exts foo"
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{ "rdapConformance" : [ "rdap_level_0", "exts", "foo" ],
  "notices" : [
    { "description" : [ "my content includes a trailing CRLF" ] } ] }
]]></artwork>
</section>

<section anchor="no-server-support-for-exts-extension"><name>No Server Support for &quot;exts&quot; Extension</name>
<t>In this example, only the client supports the &quot;exts&quot; extension, along with a fictional
extension of &quot;foo&quot; by both.</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /help HTTP/1.1
accept: application/rdap+json;exts_list="rdap_level_0 exts foo"
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{ "rdapConformance" : [ "rdap_level_0", "foo" ],
  "notices" : [
    { "description" : [ "my content includes a trailing CRLF" ] } ] }
]]></artwork>
</section>

<section anchor="differing-extension-negotiation"><name>Differing Extension Negotiation</name>
<t>In this example, both the client and server support the &quot;exts&quot; extension. The client
supports the extensions &quot;foo&quot; and &quot;bar&quot; while the server only support &quot;foo&quot;.</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /help HTTP/1.1
accept: application/rdap+json;exts_list="rdap_level_0 exts foo bar"
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{ "rdapConformance" : [ "rdap_level_0", "exts", "foo" ],
  "notices" : [
    { "description" : [ "my content includes a trailing CRLF" ] } ] }
]]></artwork>
</section>

<section anchor="transitioning-from-jcard-to-jscontact"><name>Transitioning from jCard to JSContact</name>
<t>This set of examples shows how a transition from RDAP's &quot;legacy&quot; contact format, jCard,
to JSContact.</t>
<t>The first example of the transition shows a client that supports JSContact and a server that only supports jCard.</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /entity/fizz1234 HTTP/1.1
accept: application/rdap+json;exts_list="rdap_level_0 jscontact"
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{
  "rdapConformance": [ "rdap_level_0" ],
  "objectClassName": "entity",
  "handle": "fizz1234",
  "vcardArray": [
    "vcard",
    [
      [ "version", { }, "text", "4.0" ],
      [ "fn", { }, "text", "Bob Smurd" ],
      [ "email", { }, "text", "bob@example.com" ] 
    ]
  ]
}
]]></artwork>
<t>In the next example of the transition, the server supports both jCard and JSContact and returns
JSContact because the client has signaled that it supports the JSContact extension:</t>
<t>Client Request:</t>

<artwork><![CDATA[GET /entity/fizz1234 HTTP/1.1
accept: application/rdap+json;exts_list="rdap_level_0 jscontact"
]]></artwork>
<t>Server Response:</t>

<artwork><![CDATA[HTTP/1.1 200 OK
content-type: application/rdap+json

{
  "rdapConformance": [ "rdap_level_0", "jscontact" ],
  "objectClassName": "entity",
  "handle": "fizz1234",
  "jscontact_card": {
    "@type": "Card",
    "version": "2.0",
    "name": { "full": "Bob Smurd" },
    "emails": { "email": { "address": "bob@example.com" } }
  }
}
]]></artwork>
</section>
</section>
</section>

<section anchor="links"><name>Usage in RDAP Links</name>
<t><xref target="RFC9083" sectionFormat="of" section="4.2"></xref> defines a link structure used in RDAP.</t>

<artwork><![CDATA[{
  "value": "https://example.com/context_uri",
  "rel": "self",
  "href": "https://example.com/target_uri",
  "hreflang": [ "en", "ch" ],
  "title": "title",
  "media": "screen",
  "type": "application/json"
}
]]></artwork>
<t>The link's &quot;type&quot; attribute signals to a client the expected media type of the resource
referenced in the link's &quot;href&quot; attribute, and some clients use this information to determine
if the URI in the &quot;href&quot; attribute should be de-referenced.</t>
<t>Usage of the &quot;exts_list&quot; parameter in the media type of the &quot;type&quot; attribute is allowed
but the &quot;type&quot; attribute as a whole is only a hint, as noted by <xref target="RFC8288"></xref>:</t>
<blockquote><t>The &quot;type&quot; attribute, when present, is a hint indicating what the
media type of the result of dereferencing the link should be.  Note
that this is only a hint; for example, it does not override the
Content-Type header field of a HTTP response obtained by actually
following the link.</t>
</blockquote><t>Using the &quot;exts_list&quot; parameter in the media type of the &quot;type&quot; attribute in RDAP links
is NOT RECOMMENDED as it may describe client capabilities which the client may not
possess.</t>
</section>

<section anchor="implementation-status"><name>Implementation Status</name>
<t>RFC EDITOR NOTE: Please remove this section and the reference to RFC 7942 prior to publication as an RFC.</t>
<t>This section records the status of known implementations of the protocol defined by this specification at the
time of posting of this Internet-Draft, and is based on a proposal described in RFC 7942 <xref target="RFC7942"></xref>.
The description of implementations in this section is intended to assist the IETF in its decision processes in
progressing drafts to RFCs. Please note that the listing of any individual implementation here does not imply
endorsement by the IETF. Furthermore, no effort has been spent to verify the information presented here that
was supplied by IETF contributors. This is not intended as, and must not be construed to be, a catalog of
available implementations or their features. Readers are advised to note that other implementations may exist.</t>
<t>According to RFC 7942, &quot;this will allow reviewers and working groups to assign due consideration to documents
that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback
that have made the implemented protocols more mature. It is up to the individual working groups to use this information as they see fit&quot;.</t>

<section anchor="iit-cnr-registro-it-rdap-server"><name>IIT-CNR/Registro.it RDAP Server</name>

<ul>
<li><t>Responsible Organization: Institute of Informatics and Telematics of National Research Council (IIT-CNR)/Registro.it</t>
</li>
<li><t>Location: <eref target="https://rdap.pubtest.nic.it/">https://rdap.pubtest.nic.it/</eref></t>
</li>
<li><t>Description: This implementation includes support for RDAP queries using data from the public test environment of .it ccTLD.</t>
</li>
<li><t>Level of Maturity: This is an &quot;alpha&quot; test implementation.</t>
</li>
<li><t>Coverage: This implementation includes all the features described in this specification.</t>
</li>
<li><t>Contact Information: Mario Loffredo, mario.loffredo@iit.cnr.it</t>
</li>
</ul>
</section>

<section anchor="icann-rdap-client"><name>ICANN-RDAP Client</name>

<ul>
<li><t>Responsible Organization: Internet Corporation for Assigned Names and Numbers</t>
</li>
<li><t>Location: <eref target="https://github.com/icann/icann-rdap">https://github.com/icann/icann-rdap</eref></t>
</li>
<li><t>Description: This is a general purpose RDAP client, including client libraries, used directly as CLI and embedded into other software such as intrusion detection systems.</t>
</li>
<li><t>Level of Maturity: This software is widely used, however the features of this specification are in a pre-release branch of the software.</t>
</li>
<li><t>Coverage: This implementation includes all the features described in this specification.</t>
</li>
<li><t>Contact Information: ICANN Global Support, globalsupport@icann.org</t>
</li>
</ul>
</section>

<section anchor="icann-rdap-server"><name>ICANN-RDAP Server</name>

<ul>
<li><t>Responsible Organization: Internet Corporation for Assigned Names and Numbers</t>
</li>
<li><t>Location: <eref target="https://github.com/icann/icann-rdap">https://github.com/icann/icann-rdap</eref></t>
</li>
<li><t>Description: This is a general purpose RDAP server, including libraries, used for testing and embedded into production servers of some registry service providers.</t>
</li>
<li><t>Level of Maturity: The features of this specification are in a pre-release branch of the software.</t>
</li>
<li><t>Coverage: This implementation includes all the features described in this specification.</t>
</li>
<li><t>Contact Information: ICANN Global Support, globalsupport@icann.org</t>
</li>
</ul>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>As stated in <xref target="using"></xref>, this specification does not override the protocol elements of
RDAP security extensions, such as <xref target="RFC9560"></xref>, nor does it override
the protocol elements of other security features of HTTP.</t>
<t>This specification does contrast with solutions using query parameters in that those
solutions require servers to blindly copy query parameters into redirect URLs in
situations where such copying could cause harm, such as copying an API key intended
for one server into the redirect URL of another server.</t>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="rdap-extension-registry"><name>RDAP Extension Registry</name>
<t>The IETF requests the IANA to register the following extension in the RDAP Extensions Registry at <xref target="RDAP-EXTENSIONS"></xref>:</t>

<artwork><![CDATA[Extension identifier: exts

Registry operator: ALL

Published specification: [RFC Reference Once Published]

Person & email address to contact for further information:
The Internet Engineering Steering Group <iesg@ietf.org>

Intended usage: COMMON
]]></artwork>
</section>

<section anchor="addition-of-exts-list-parameter-to-the-rdap-media-type"><name>Addition of &quot;exts_list&quot; Parameter to the RDAP Media Type</name>
<t>This document defines the optional parameter &quot;exts_list&quot; for the media type &quot;application/rdap+json&quot;
as described in <xref target="parameter"></xref>.</t>
<t>The IETF requests the IANA to add this document as an additional reference to the IANA Media Type registry at <xref target="MEDIA-TYPES"></xref> for
the media type &quot;application/rdap+json&quot;.</t>
</section>
</section>

<section anchor="acknowledgements"><name>Acknowledgements</name>
<t>Pawel Kowalik provided extensive review of this document and conducted a study that forms the
basis of re-using the existing RDAP media type. James Mitchell has provided ideas and feedbacks that have contributed to
the content of this document based on his RDAP server implementation experience. Murray Kucherawy and Alexey Melnikov provided guidance on the use of media types and
media type parameters. Maarten Wullink and Jame Gould provided feedback that contributed to the content of this document. Mario Loffredo has provided valuable
feedback on the contents of this specification, including feedback from his implementation, that has helped to reduce interoperability
issues.</t>
</section>

</middle>

<back>
<references><name>References</name>
<references><name>Normative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7480.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8288.xml"/>
</references>
<references><name>Informative References</name>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-regext-rdap-extensions.xml"/>
<reference anchor="MEDIA-TYPES" target="https://www.iana.org/assignments/media-types/">
  <front>
    <title>Media Types</title>
    <author>
      <organization>IANA</organization>
    </author>
  </front>
</reference>
<reference anchor="RDAP-EXTENSIONS" target="https://www.iana.org/assignments/rdap-extensions/">
  <front>
    <title>RDAP Extensions</title>
    <author>
      <organization>IANA</organization>
    </author>
  </front>
</reference>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2045.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3986.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7942.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9083.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml"/>
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9560.xml"/>
</references>
</references>

<section anchor="vary_header"><name>Using the Vary Header</name>
<t>Server implementers may want to consider using the &quot;vary&quot; header depending on the caching
behavior desired of shared caches (i.e., middleboxes, not client caches).</t>
<t>Consider the following scenario where user Bob and user Alice send queries to the same
RDAP server that is routed through a middlebox network element implementing a shared HTTP cache.</t>
<t>User Bob sends a query for the domain &quot;example.com&quot;
(<eref target="http://regy.example/domain/example.com">http://regy.example/domain/example.com</eref>) without the &quot;exts_list&quot; parameter. The &quot;accept&quot; header sent
for Bob's query would be <tt>accept: application/rdap+json</tt> or <tt>accept: application/json</tt>.</t>
<t>User Alice later sends a query for the same domain, however her client uses the &quot;exts_list&quot; parameter. The &quot;accept&quot;
header sent for Alice's query might be <tt>accept: application/rdap+json;exts_list=&quot;rdap_level_0 exts foo&quot;</tt>.</t>
<t>If no &quot;vary&quot; header is set in the response for these queries, the shared cache will compare only
the URL of the query when processing cache items and therefore user Bob and user Alice would receive
the same answer. In other words, since both queried &quot;<eref target="http://regy.example/domain/example.com&quot;">http://regy.example/domain/example.com"</eref> the shared
cache would return the answer of the first query to the second query and all other subsequent queries
until the item expired out of the cache.</t>
<t>If server implementers do not desire this behavior and would signal that caches consider each query
separately, servers should also return a &quot;vary: accept&quot; header to inform the cache that the &quot;accept&quot;
header should also be considered when processing cache items. Server implementers should also
consult <xref target="RFC9110"></xref> regarding caching and other uses of the &quot;vary&quot; header.</t>
</section>

<section anchor="design_considerations"><name>Design Considerations</name>

<section anchor="reusing-the-existing-media-type"><name>Reusing the Existing Media Type</name>
<t>Earliest versions of this document specified a new media type because the authors believed
the addition of new parameter on the existing RDAP media type may be backwards-incompatible
with many RDAP servers. However, a study conducted by Pawel Kowalik concluded that 99.65%
of RDAP servers are compatible with a new parameter on the existing RDAP media type.</t>
<t>Additionally, <xref target="RFC2045"></xref> requires that the server ignore unknown parameters.</t>
</section>

<section anchor="inappropriate-use-of-query-parameters"><name>Inappropriate Use of Query Parameters</name>
<t>Another design approach to communicating RDAP extensions from the client to the
server would be the use of URI query parameters:</t>

<artwork><![CDATA[https://rdap.example/domain/foo.example?exts_list=fizzbuzz  
]]></artwork>
<t>However, there are a few problems with using query parameters for this scenario.
Some of these problems are specific to RDAP and are also documented in
<xref target="I-D.ietf-regext-rdap-extensions"></xref>. The following sections also describe the
problems.</t>

<section anchor="copy-and-paste"><name>Copy and Paste</name>
<t>Consider two RDAP users, Alice and Bob. Alice has an RDAP client that supports
the extension &quot;fizzbuzz&quot;, and Bob has an RDAP client that does not support this
extension.</t>
<t>Now consider the scenario where Alice copies and pastes the RDAP URL from above into an email
and sends it to Bob. When Bob uses that URL with his RDAP client, it will be communicating
to the server that the extension &quot;fizzbuzz&quot; is understood by Bob's client when it is not.</t>
<t>In this scenario, Bob's client will be unable to render the RDAP extension regardless
of the usage of the query parameter. However, if the server is using the query
parameter for secondary purposes, such as gathering metrics and statistics, then the
capabilities of Bob's client would have been incorrectly signalled to the server.</t>
</section>

<section anchor="redirects"><name>Redirects</name>
<t>The RDAP ecosystem uses redirects in many situations. <xref target="RFC7480"></xref> discusses &quot;aggregators&quot;, which
are RDAP servers used to help clients find authoritative RDAP servers using the RDAP bootstrap
registries. Redirects are also heavily used by the RIRs when IP addresses or autonomous
system numbers are transferred from one RIR to another.</t>
<t>Within HTTP, URI query parameters are not explicitly preserved during a redirect (probably
due to architecture considerations: see the section below). Specific to RDAP, <xref target="RFC7480"></xref>
instructs RDAP servers to ignore unknown query parameters and instructs clients not to
transform the URL of a redirect.</t>
<t>Therefore, query parameters denoting RDAP extensions should not survive redirects in RDAP, and in many real-world examples
they do not survive redirects. This can
be readily observed in currently deployed RDAP servers:</t>

<artwork><![CDATA[curl -v https://rdap-bootstrap.arin.net/bootstrap/autnum/2830?exts_list=fizzbuzz    
]]></artwork>
<t>To further demonstrate that query parameters do not automatically survive redirects but that media types
do, consider the code found <eref target="https://github.com/anewton1998/draft-regext-ext-json-media-type">here</eref>.
This code consists of a simple client and a simple server. The client sets both a new
media type and query parameters. The servers listen on two ports, redirecting the client
from a URL on the first port to a URL on the second port.</t>
<t>Preservation of query parameters is not a guaranteed feature of HTTP client and server libraries,
whereas preservation of media types is much more likely to occur.</t>
</section>

<section anchor="referral-compatibility"><name>Referral Compatibility</name>
<t>It is common in the RDAP ecosystem to link from one RDAP resource to another. These are typically
conveyed in the link structure defined in <xref target="RFC9083" sectionFormat="of" section="4.2"></xref> and use the &quot;application/rdap+json&quot;
media type. One common usage is to link to a domain registration in a domain registrar from
a domain registration in a domain registry.</t>

<artwork><![CDATA[{
  "value" : "https://regy.example/domain/foo.example",
  "rel" : "related",
  "href" : "https://regr.example/domain/foo.example",
  "type" : "application/rdap+json"
}
]]></artwork>
<t>Usage of the &quot;exts_list&quot; media-type parameter does not require clients to conduct further processing of these
referrals, whereas a query parameter approach would require clients to process and de-conflict
any other query parameters if present.</t>
<t>Just as in the copy-and-paste scenario above, a referral with a query parameter representing the RDAP extensions understood
by the client (i.e., the client's capability to understand RDAP responses), may indicate to a server some capabilities the client
may not possess.</t>
<t>Consider a scenario in which a user has a client that does no support the JSContact extension (i.e., it only supports jCard) and encounters the
following referral using a query parameter:</t>

<artwork><![CDATA[{
  "value" : "https://regy.example/domain/foo.example",
  "rel" : "related",
  "href" : "https://regr.example/domain/foo.example?exts_list=jscontact,
  "type" : "application/rdap+json"
}
]]></artwork>
<t>Now consider that the server at regr.example is in a transition phase between jCard and JSContact and serves only JSContact when it is told the client
understands JSContact. In this scenario, the user would not be capable of processing the contact information because their client
only understands jCard and the server has responded only with JSContact.</t>
</section>

<section anchor="architectural-violations"><name>Architectural Violations</name>
<t><xref target="RFC3986" sectionFormat="of" section="3.4"></xref> states the following:</t>
<blockquote><t>The query component contains non-hierarchical data that, along with
data in the path component (Section 3.3), serves to identify a
resource within the scope of the URI's scheme and naming authority
(if any).</t>
</blockquote><t>Therefore, URI query parameters are meant to be part of the identity of the resource
being identified by a URI and pointed to by the location of a URL. RDAP extensions change
the portions of JSON returned by the server but are not intended to change the resource
being identified. That is, a domain registration is the same domain registration regardless
of whether the postal address in that domain registration is communicated via jCard or
a new RDAP extension for JSContact.</t>
<t>Changing how the content of a resource is conveyed is called content negotiation and
is discussed in detail in <xref target="RFC9110"></xref> using media types.</t>
</section>
</section>
</section>

</back>

</rfc>
