rfc8977xml2.original.xml   rfc8977.xml 
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "http://xml.resource.org/authoring/rfc2629.dtd"
[
<!ENTITY RFC2119 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml'>
<!ENTITY RFC5234 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5234.xml'>
<!ENTITY RFC5890 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5890.xml'>
<!ENTITY RFC6350 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.6350.xml'>
<!ENTITY RFC6901 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.6901.xml'>
<!ENTITY RFC7095 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7095.xml'>
<!ENTITY RFC7230 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7230.xml'>
<!ENTITY RFC7231 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7231.xml'>
<!ENTITY RFC7480 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7480.xml'>
<!ENTITY RFC7481 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7481.xml'>
<!ENTITY RFC7482 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7482.xml'>
<!ENTITY RFC7483 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7483.xml'>
<!ENTITY RFC7942 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.7942.xml'>
<!ENTITY RFC8174 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.8174.xml'>
<!ENTITY RFC8259 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.8259.xml'>
<!ENTITY RFC8288 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.8288.xml'>
<!ENTITY RFC8605 PUBLIC ''
'http://xml.resource.org/public/rfc/bibxml/reference.RFC.8605.xml'>
<!ENTITY W3C.CR-xpath-31-20161213 PUBLIC ''
'https://xml2rfc.tools.ietf.org/public/rfc/bibxml4/reference.W3C.CR-xpath-31-
20161213.xml'>
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<?rfc toc="yes"?> <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?> <rfc xmlns:xi="http://www.w3.org/2001/XInclude" xml:lang="en" submissionType="IE
<?rfc compact="yes"?> TF"
<?rfc subcompact="yes"?> category="std" consensus="true" docName="draft-ietf-regext-rdap-sorting-and-pagi
<?rfc sortrefs="yes"?> ng-20"
<?rfc symrefs="yes"?> number="8977" updates="" obsoletes="" ipr="trust200902" tocInclude="true" tocDep
<?rfc iprnotified="no"?> th="4"
sortRefs="true" symRefs="true" version="3">
<rfc category="std" docName="draft-ietf-regext-rdap-sorting-and-paging-20" ipr=" trust200902">
<front> <front>
<title abbrev="RDAP Sorting and Paging">Registration Data Access Protocol (R DAP) Query Parameters for Result Sorting and Paging</title> <title abbrev="RDAP Sorting and Paging">Registration Data Access Protocol (R DAP) Query Parameters for Result Sorting and Paging</title>
<seriesInfo name="RFC" value="8977"/>
<author fullname="Mario Loffredo" initials="M." surname="Loffredo"> <author fullname="Mario Loffredo" initials="M." surname="Loffredo">
<organization>IIT-CNR/Registro.it</organization> <organization>IIT-CNR/Registro.it</organization>
<address> <address>
<postal> <postal>
<street>Via Moruzzi,1</street> <street>Via Moruzzi,1</street>
<city>Pisa</city> <city>Pisa</city>
<country>IT</country> <country>Italy</country>
<code>56124</code> <code>56124</code>
</postal> </postal>
<email>mario.loffredo@iit.cnr.it</email> <email>mario.loffredo@iit.cnr.it</email>
<uri>http://www.iit.cnr.it</uri> <uri>https://www.iit.cnr.it</uri>
</address> </address>
</author> </author>
<author fullname="Maurizio Martinelli" initials="M." surname="Martinelli"> <author fullname="Maurizio Martinelli" initials="M." surname="Martinelli">
<organization>IIT-CNR/Registro.it</organization> <organization>IIT-CNR/Registro.it</organization>
<address> <address>
<postal> <postal>
<street>Via Moruzzi,1</street> <street>Via Moruzzi,1</street>
<city>Pisa</city> <city>Pisa</city>
<country>IT</country> <country>Italy</country>
<code>56124</code> <code>56124</code>
</postal> </postal>
<email>maurizio.martinelli@iit.cnr.it</email> <email>maurizio.martinelli@iit.cnr.it</email>
<uri>http://www.iit.cnr.it</uri> <uri>https://www.iit.cnr.it</uri>
</address> </address>
</author> </author>
<author initials="S." surname="Hollenbeck" fullname="Scott Hollenbeck"> <author initials="S." surname="Hollenbeck" fullname="Scott Hollenbeck">
<organization>Verisign Labs</organization> <organization>Verisign Labs</organization>
<address> <address>
<postal> <postal>
<street>12061 Bluemont Way</street> <street>12061 Bluemont Way</street>
<city>Reston</city> <city>Reston</city>
<region>VA</region> <region>VA</region>
<code>20190</code> <code>20190</code>
<country>USA</country> <country>United States of America</country>
</postal> </postal>
<email>shollenbeck@verisign.com</email> <email>shollenbeck@verisign.com</email>
<uri>https://www.verisignlabs.com/</uri> <uri>https://www.verisignlabs.com/</uri>
</address> </address>
</author> </author>
<date year="2021" month="January" />
<date/>
<area>Applications and Real-Time</area> <area>Applications and Real-Time</area>
<workgroup>Registration Protocols Extensions</workgroup> <workgroup>Registration Protocols Extensions</workgroup>
<keyword>RDAP</keyword> <keyword>RDAP</keyword>
<keyword>Sorting</keyword> <keyword>Sorting</keyword>
<keyword>Paging</keyword> <keyword>Paging</keyword>
<abstract> <abstract>
<t>The Registration Data Access Protocol (RDAP) does not include core func tionality for clients to provide sorting and paging parameters for control of la rge result sets. This omission can lead to unpredictable server processing of q ueries and client processing of responses. This unpredictability can be greatly reduced if clients can provide servers with their preferences for managing larg e responses. This document describes RDAP query extensions that allow clients t o specify their preferences for sorting and paging result sets.</t> <t>The Registration Data Access Protocol (RDAP) does not include core func tionality for clients to provide sorting and paging parameters for control of la rge result sets. This omission can lead to unpredictable server processing of q ueries and client processing of responses. This unpredictability can be greatly reduced if clients can provide servers with their preferences for managing larg e responses. This document describes RDAP query extensions that allow clients t o specify their preferences for sorting and paging result sets.</t>
</abstract> </abstract>
</front> </front>
<middle> <middle>
<section title="Introduction"> <section>
<name>Introduction</name>
<t>The availability of functionality for result sorting and paging provide s benefits to both clients and servers in the implementation of RESTful services <xref target="REST"/>. These benefits include:</t> <t>The availability of functionality for result sorting and paging provide s benefits to both clients and servers in the implementation of RESTful services <xref target="REST"/>. These benefits include:</t>
<ul>
<t><list style="symbols"> <li>reducing the server response bandwidth requirements</li>
<t>reducing the server response bandwidth requirements;</t> <li>improving server response time</li>
<t>improving server response time;</t> <li>improving query precision and, consequently, obtaining more relevant
<t>improving query precision and, consequently, obtaining more relevant results</li>
results;</t> <li>decreasing server query processing load</li>
<t>decreasing server query processing load;</t> <li>reducing client response processing time</li>
<t>reducing client response processing time.</t> </ul>
</list></t>
<t>Approaches to implementing features for result sorting and paging can b e grouped into two main categories:</t> <t>Approaches to implementing features for result sorting and paging can b e grouped into two main categories:</t>
<ol type="1"><li>
<t>Sorting and paging are implemented through the introduction of addi
tional parameters in the query string (e.g., the Open Data Protocol (ODATA) <xre
f target="ODATA-PART1"/>).</t>
<t><list style="numbers"> </li>
<t>sorting and paging are implemented through the introduction of addit <li>Information related to the number of results and the specific portio
ional parameters in the query string (e.g. ODATA protocol <xref target="OData-Pa n of the result set to be returned, in addition to a set of ready-made links for
rt1"/>);<vspace blankLines='1' /></t> the result set scrolling, are inserted in the HTTP header of the request/respon
<t>information related to the number of results and the specific portio se <xref target="RFC7231"/>.</li>
n of the result set to be returned, in addition to a set of ready-made links for </ol>
the result set scrolling, are inserted in the HTTP header of the request/respon <t>However, there are some drawbacks associated with the use of the HTTP h
se <xref target="RFC7231"/>.</t> eader. First, the header properties cannot be set directly from a web browser.
</list></t> Moreover, in an HTTP session, the information on the status (i.e., the session
identifier) is usually inserted in the header or a cookie, while the information
on the resource identification or the search type is included in the query stri
ng. Finally, providing custom information through HTTP headers assumes the clie
nt has prior knowledge of the server implementation, which is widely considered
a Representational State Transfer (REST) design anti-pattern. As a result, this
document describes a specification based on the use of query parameters.</t>
<t>Currently, RDAP <xref target="RFC7482"/> defines two query types:</t>
<t>However, there are some drawbacks associated with the use of the HTTP h eader. First, the header properties cannot be set directly from a web browser. Moreover, in an HTTP session, the information on the status (i.e. the session i dentifier) is usually inserted in the header or a cookie, while the information on the resource identification or the search type is included in the query strin g. Finally, providing custom information through HTTP headers assumes the clien t to have a prior knowledge of the server implementation which is widely conside red a REST design anti-pattern. As a result, this document describes a specific ation based on the use of query parameters.</t> <dl>
<t>Currently, the RDAP protocol <xref target="RFC7482"/> defines two query <dt>lookup:
types:</t> </dt>
<dd>the server returns only one object
</dd>
<t><list style="symbols"> <dt>search:
<t>lookup: the server returns only one object;</t> </dt>
<t>search: the server returns a collection of objects.</t> <dd>the server returns a collection of objects
</list></t> </dd>
<t>While the lookup query does not raise issues regarding response size ma nagement, the search query can potentially generate a large result set that is o ften truncated according to server limits. Besides, it is not possible to obtai n the total number of objects found that might be returned in a search query res ponse <xref target="RFC7483"/>. Lastly, there is no way to specify sort criteri a to return the most relevant objects at the beginning of the result set. There fore, the client might traverse the whole result set to find the relevant object s or, due to truncation, might not find them at all.</t> </dl>
<t>The specification described in this document extends RDAP query capabil <t>While the lookup query does not raise issues regarding response size ma
ities to enable result sorting and paging, by adding new query parameters that c nagement, the search query can potentially generate a large result set that is o
an be applied to RDAP search path segments. The service is implemented using th ften truncated according to server limits. Besides, it is not possible to obtai
e Hypertext Transfer Protocol (HTTP) <xref target="RFC7230"/> and the convention n the total number of objects found that might be returned in a search query res
s described in <xref target="RFC7480"/>.</t> ponse <xref target="RFC7483"/>. Lastly, there is no way to specify sort criteri
a to return the most relevant objects at the beginning of the result set. There
fore, the client might traverse the whole result set to find the relevant object
s or, due to truncation, might not find them at all.</t>
<t>The specification described in this document extends RDAP query capabil
ities to enable result sorting and paging by adding new query parameters that ca
n be applied to RDAP search path segments. The service is implemented using the
Hypertext Transfer Protocol (HTTP) <xref target="RFC7230"/> and the conventions
described in <xref target="RFC7480"/>.</t>
<t>The implementation of the new parameters is technically feasible, as op
erators for counting, sorting, and paging rows are currently supported by the ma
jor relational database management systems.</t>
<section>
<name>Conventions Used in This Document</name>
<t>The implementation of the new parameters is technically feasible, as op <t>
erators for counting, sorting and paging rows are currently supported by the maj The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
or relational database management systems.</t> "<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&nbsp;14 <xref target="RFC2119"/>
<xref target="RFC8174"/> when, and only when, they appear in all capitals,
as shown here.
</t>
<section title="Conventions Used in This Document">
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "
SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" i
n this document are to be interpreted as described in BCP 14 <xref target="RFC21
19"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals,
as shown here.</t>
</section> </section>
</section> </section>
<section anchor="rdap-query-parameter-specification">
<name>RDAP Query Parameter Specification</name>
<t>The new query parameters are <bcp14>OPTIONAL</bcp14> extensions of path
segments defined in <xref target="RFC7482"/>. They are as follows:</t>
<section anchor="rdap-query-parameter-specification" title="RDAP Query Parame ter Specification"> <dl>
<t>The new query parameters are OPTIONAL extensions of path segments defin <dt>"count":
ed in <xref target="RFC7482"/>. They are as follows:</t> </dt>
<dd>a boolean value that allows a client to request the return of the total numb
er of objects found
</dd>
<t><list style="symbols"> <dt>"sort":
<t>&quot;count&quot;: a boolean value that allows a client to request t </dt>
he return of the total number of objects found;<vspace blankLines='1'/></t> <dd>a string value that allows a client to request a specific sort order for the
<t>&quot;sort&quot;: a string value that allows a client to request a s result set
pecific sort order for the result set;<vspace blankLines='1'/></t> </dd>
<t>&quot;cursor&quot;: a string value representing a pointer to a specif
ic fixed size portion of the result set.</t> <dt>"cursor":
</list></t> </dt>
<dd>a string value representing a pointer to a specific fixed-size portion of th
e result set
</dd>
</dl>
<t>Augmented Backus-Naur Form (ABNF) <xref target="RFC5234"/> is used in t he following sections to describe the formal syntax of these new parameters.</t> <t>Augmented Backus-Naur Form (ABNF) <xref target="RFC5234"/> is used in t he following sections to describe the formal syntax of these new parameters.</t>
<section anchor="sorting_and_paging_metadata">
<name>Sorting and Paging Metadata</name>
<section anchor="sorting_and_paging_metadata" title="Sorting and Paging Me <t>According to most advanced principles in REST design, collectively
tadata"> known as HATEOAS (Hypermedia as the Engine of Application State)
<xref target="HATEOAS"/>, a client entering a REST application through
an initial URI should use server-provided links to dynamically
discover available actions and access the resources it needs. In this
way, the client is neither required to have prior knowledge of the
service nor, consequently, to hard code the URIs of different
resources. This allows the server to make URI changes as the API
evolves without breaking clients. Definitively, a REST service should
be as self-descriptive as possible.</t>
<t>According to most advanced principles in REST design, collectively known as H <t>Therefore, servers implementing the query parameters described in thi
ATEOAS (Hypermedia as the Engine of Application State) <xref target="HATEOAS"/>, s specification <bcp14>SHOULD</bcp14> provide additional information in their re
a client entering a REST application through an initial URI should use server-p sponses about both the available sorting criteria and possible pagination. Such
rovided links to dynamically discover available actions and access the resources information is collected in two <bcp14>OPTIONAL</bcp14> response elements named
it needs. In this way, the client is not required to have prior knowledge of t "sorting_metadata" and "paging_metadata".</t>
he service and, consequently, to hard code the URIs of different resources. Thi <t>The "sorting_metadata" element contains the following properties:</t>
s allows the server to make URI changes as the API evolves without breaking clie
nts. Definitively, a REST service should be as self-descriptive as possible.</t
>
<t>Therefore, servers implementing the query parameters described in this specif ication SHOULD provide additional information in their responses about both the available sorting criteria and possible pagination. Such information is collect ed in two OPTIONAL response elements named &quot;sorting_metadata&quot; and &quo t;paging_metadata&quot;.</t> <dl newline="true">
<t>The &quot;sorting_metadata&quot; element contains the following prope <dt>"currentSort": "String" (<bcp14>OPTIONAL</bcp14>)
rties:</t> </dt>
<t><list style="symbols"> <dd>Either the value of the "sort" parameter as specified in the query string or
<t>&quot;currentSort&quot;: &quot;String&quot; (OPTIONAL) either the va the sort applied by default, if any.
lue of &quot;sort&quot; parameter as specified in the query string or the sort a </dd>
pplied by default, if any;<vspace blankLines='1'/></t>
<t>&quot;availableSorts&quot;: &quot;AvailableSort[]&quot; (OPTIONAL) a
n array of objects, with each element describing an available sort criterion. T
he AvailableSort object includes the following members:
<list style="symbols">
<t>&quot;property&quot;: &quot;String&quot; (REQUIRED) the name that ca
n be used by the client to request the sort criterion;</t>
<t>&quot;default&quot;: &quot;Boolean&quot; (REQUIRED) whether the sor
t criterion is applied by default. An RDAP server MUST define only one default
sorting property for each object class;</t>
<t>&quot;jsonPath&quot;: &quot;String&quot; (OPTIONAL) the JSONPath ex
pression of the RDAP field corresponding to the property;</t>
<t>&quot;links&quot;: &quot;Link[]&quot; (OPTIONAL) an array of links a
s described in <xref target="RFC8288"/> containing the query string that applies
the sort criterion.</t>
</list></t>
</list></t>
<t>At least one of the &quot;currentSort&quot; and &quot;availableSorts&quot; pr <dt>"availableSorts": "AvailableSort[]" (<bcp14>OPTIONAL</bcp14>)
operties MUST be present.</t> </dt>
<t>The &quot;paging_metadata&quot; element contains the following fields <dd><t>An array of objects, with each element describing an available sort crite
:</t> rion. The AvailableSort object includes the following members:</t>
<t><list style="symbols">
<t>&quot;totalCount&quot;: &quot;Numeric&quot; (OPTIONAL) a numeric val
ue representing the total number of objects found. It MUST be provided if and o
nly if the query string contains the &quot;count&quot; parameter;<vspace blankLi
nes='1'/></t>
<t>&quot;pageSize&quot;: &quot;Numeric&quot; (OPTIONAL) a numeric value
representing the number of objects that should have been returned in the curren
t page. It MUST be provided if and only if the total number of objects exceeds
the page size. This property is redundant for RDAP clients because the page siz
e can be derived from the length of the search results array but, it can be help
ful if the end user interacts with the server through a web browser;<vspace blan
kLines='1'/></t>
<t>&quot;pageNumber&quot;: &quot;Numeric&quot; (OPTIONAL) a numeric val
ue representing the number of the current page in the result set. It MUST be pr
ovided if and only if the total number of objects found exceeds the page size;<v
space blankLines='1'/></t>
<t>&quot;links&quot;: &quot;Link[]&quot; (OPTIONAL) an array of links a
s described in <xref target="RFC8288"/> containing the reference to the next pag
e. In this specification, only forward pagination is described because it is al
l that is necessary to traverse the result set.</t>
</list></t>
<section anchor="rdap-conformance" title="RDAP Conformance"> <dl newline="true">
<t>Servers returning the &quot;paging_metadata&quot; element in their resp
onse MUST include the string literal &quot;paging&quot; in the rdapConformance a
rray. Servers returning the &quot;sorting_metadata&quot; element MUST include t
he string literal &quot;sorting&quot;.</t>
</section>
</section> <dt>"property": "String" (<bcp14>REQUIRED</bcp14>)
</dt>
<dd>The name that can be used by the client to request the sort criterion.
</dd>
<section anchor="count-parameter" title="&quot;count&quot; Parameter"> <dt>"default": "Boolean" (<bcp14>REQUIRED</bcp14>)
</dt>
<dd>Indicator of whether the sort criterion is applied by default. An RDAP serve
r <bcp14>MUST</bcp14> define only one default sorting property for each object c
lass.
</dd>
<t>Currently, the RDAP protocol does not allow a client to determine the <dt>"jsonPath": "String" (<bcp14>OPTIONAL</bcp14>)
total number of the results in a query response when the result set is truncated </dt>
. This is inefficient because the user cannot determine if the result set is co <dd>The JSONPath expression of the RDAP field corresponding to the property.
mplete.</t> </dd>
<t>The &quot;count&quot; parameter provides additional functionality that <dt>"links": "Link[]" (<bcp14>OPTIONAL</bcp14>)
allows a client to request information from the server that specifies the total </dt>
number of objects matching the search pattern.</t> <dd>An array of links as described in <xref target="RFC8288"/> containing the
query string that applies the sort criterion.
</dd>
<t>The following is an example of an RDAP query including the &quot;coun t&quot; parameter:</t> </dl>
<t>https://example.com/rdap/domains?name=example*.com&amp;count=true</t> </dd>
<t>The ABNF syntax is the following:</t> </dl>
<t><list style="empty">
<t>count = &quot;count=&quot; ( trueValue / falseValue )</t>
<t>trueValue = (&quot;true&quot; / &quot;yes&quot; / &quot;1&quot
;)</t>
<t>falseValue = (&quot;false&quot; / &quot;no&quot; / &quot;0&quo
t;)</t>
</list></t>
<t>A trueValue means that the server MUST provide the total number of the <t>At least one of the "currentSort" and "availableSorts" properties
objects in the &quot;totalCount&quot; field of the &quot;paging_metadata&quot; <bcp14>MUST</bcp14> be present.</t>
element (<xref target="count-in-response-example"/>). A falseValue means that t <t>The "paging_metadata" element contains the following fields:</t>
he server MUST NOT provide this number.</t>
<figure anchor="count-in-response-example" title="Example of RDAP response <dl newline="true">
with &quot;paging_metadata&quot; element containing the &quot;totalCount&quot;
field"> <dt>"totalCount": "Numeric" (<bcp14>OPTIONAL</bcp14>)
<artwork xml:space="preserve"> </dt>
<dd>A numeric value representing the total number of objects found. It
<bcp14>MUST</bcp14> be provided if and only if the query string contains the
"count" parameter.
</dd>
<dt>"pageSize": "Numeric" (<bcp14>OPTIONAL</bcp14>)
</dt>
<dd>A numeric value representing the number of objects that should have been
returned in the current page. It <bcp14>MUST</bcp14> be provided if and only
if the total number of objects exceeds the page size. This property is
redundant for RDAP clients because the page size can be derived from the
length of the search results array, but it can be helpful if the end user
interacts with the server through a web browser.
</dd>
<dt>"pageNumber": "Numeric" (<bcp14>OPTIONAL</bcp14>)
</dt>
<dd>A numeric value representing the number of the current page in the result
set. It <bcp14>MUST</bcp14> be provided if and only if the total number of
objects found exceeds the page size.
</dd>
<dt>"links": "Link[]" (<bcp14>OPTIONAL</bcp14>)
</dt>
<dd>An array of links as described in <xref target="RFC8288"/> containing the
reference to the next page. In this specification, only forward pagination is
described because it is all that is necessary to traverse the result set.
</dd>
</dl>
<section anchor="rdap-conformance">
<name>RDAP Conformance</name>
<t>Servers returning the "paging_metadata" element in their response
<bcp14>MUST</bcp14> include the string literal "paging" in the
rdapConformance array. Servers returning the "sorting_metadata"
element <bcp14>MUST</bcp14> include the string literal
"sorting".</t>
</section>
</section>
<section anchor="count-parameter">
<name>"count" Parameter</name>
<t>Currently, RDAP does not allow a client to determine
the total number of results in a query response when the result
set is truncated. This is inefficient because the user cannot
determine if the result set is complete.</t>
<t>The "count" parameter provides additional functionality that allows
a client to request information from the server that specifies the
total number of objects matching the search pattern.</t>
<t>The following is an example of an RDAP query including the "count" pa
rameter:</t>
<t>https://example.com/rdap/domains?name=example*.com&amp;count=true
</t>
<t>The ABNF syntax is the following:</t>
<sourcecode type="abnf">
count = "count=" ( trueValue / falseValue )
trueValue = ("true" / "yes" / "1")
falseValue = ("false" / "no" / "0")
</sourcecode>
<t>A trueValue means that the server <bcp14>MUST</bcp14> provide the
total number of objects in the "totalCount" field of the
"paging_metadata" element (<xref
target="count-in-response-example"/>). A falseValue means that the
server <bcp14>MUST NOT</bcp14> provide this number.</t>
<figure anchor="count-in-response-example">
<name>Example of RDAP Response with "paging_metadata" Element Containi
ng the "totalCount" Field</name>
<sourcecode type="json">
{ {
"rdapConformance": [ "rdapConformance": [
"rdap_level_0", "rdap_level_0",
"paging" "paging"
], ],
... ...
"paging_metadata": { "paging_metadata": {
"totalCount": 43 "totalCount": 43
}, },
"domainSearchResults": [ "domainSearchResults": [
... ...
] ]
} }
</artwork> </sourcecode>
</figure> </figure>
</section> </section>
<section anchor="sort-parameter">
<name>"sort" Parameter</name>
<t>RDAP does not provide any capability to specify the result set sort c
riteria. A server could implement a default sorting scheme according to the obj
ect class, but this feature is not mandatory and might not meet user requirement
s. Sorting can be addressed by the client, but this solution is rather ineffici
ent. Sorting features provided by the RDAP server could help avoid truncation o
f relevant results.</t>
<t>The "sort" parameter allows the client to ask the server to sort the
results according to the values of one or more properties and according to the s
ort direction of each property. The ABNF syntax is the following:</t>
<sourcecode type="abnf">
sort = "sort=" sortItem *( "," sortItem )
sortItem = property-ref [":" ( "a" / "d" ) ]
property-ref = ALPHA *( ALPHA / DIGIT / "_" )
</sourcecode>
<section anchor="sort-parameter" title="&quot;sort&quot; Parameter"> <t>"a" means that an ascending sort <bcp14>MUST</bcp14> be applied; "d"
means that a descending sort <bcp14>MUST</bcp14> be applied. If the sort direct
ion is absent, an ascending sort <bcp14>MUST</bcp14> be applied.</t>
<t>The following are examples of RDAP queries that include the "sort" pa
rameter:</t>
<t>The RDAP protocol does not provide any capability to specify the resul <t>
t set sort criteria. A server could implement a default sorting scheme accordin https://example.com/rdap/domains?name=example*.com&amp;sort=name
g to the object class, but this feature is not mandatory and might not meet user </t>
requirements. Sorting can be addressed by the client, but this solution is rat <t>
her inefficient. Sorting features provided by the RDAP server could help avoid https://example.com/rdap/
truncation of relevant results.</t> domains?name=example*.com&amp;sort=registrationDate:d
</t>
<t>
https://example.com/rdap/
domains?name=example*.com&amp;sort=lockedDate,name
</t>
<t>Except for sorting IP addresses and values denoting dates and times,
servers <bcp14>MUST</bcp14> implement sorting according to the JSON value type o
f the RDAP field the sorting property refers to. That is, JSON strings <bcp14>M
UST</bcp14> be sorted lexicographically, and JSON numbers <bcp14>MUST</bcp14> be
sorted numerically. Values denoting dates and times <bcp14>MUST</bcp14> be sor
ted in chronological order. If IP addresses are represented as JSON strings, th
ey <bcp14>MUST</bcp14> be sorted based on their numeric conversion.</t>
<t>The &quot;sort&quot; parameter allows the client to ask the server to <t>The conversion of an IPv4 address to a number is possible since each
sort the results according to the values of one or more properties and according dotted format IPv4 address is a representation of a number written in a 256-base
to the sort direction of each property. The ABNF syntax is the following:</t> d manner; for example, 192.168.0.1 means 1*256^0 + 0*256^1 + 168*256^2 + 192*256
^3 = 3232235521. Similarly, an IPv6 address can be converted into a number by
applying the base 65536. Therefore, the numerical representation of the IPv6 ad
dress 2001:0db8:85a3:0:0:8a2e:0370:7334 is 4254076645264115407174021557775764357
2. Built-in functions and libraries for converting IP addresses into numbers ar
e available in most known programming languages and relational database manageme
nt systems.</t>
<t>If the "sort" parameter presents an allowed sorting property, it <bcp
14>MUST</bcp14> be provided in the "currentSort" field of the "sorting_metadata"
element.</t>
<section anchor="sorting_properties">
<name>Sorting Properties Declaration</name>
<t>In the "sort" parameter ABNF syntax, the element named "property-re
f" represents a reference to a property of an RDAP object. Such a reference cou
ld be expressed by using a JSONPath expression (named "jsonpath" in the followin
g).</t>
<t>JSONPath is a syntax, originally based on the XML XPath notation <x
ref target="W3C.CR-xpath-31-20170321"/>, which represents a path to select an el
ement (or a set of elements) in a JSON document <xref target="RFC8259"/>. For e
xample, the jsonpath to select the value of the ASCII name inside an RDAP domain
lookup response is "$.ldhName", where $ identifies the root of the document obj
ect model (DOM). Another way to select a value inside a JSON document is the JS
ON Pointer <xref target="RFC6901"/>.</t>
<t>While JSONPath and JSON Pointer are both commonly adopted
notations to select any value inside JSON data, neither is
particularly concise and easy to use
(e.g., "$.domainSearchResults[*].events[?(@.eventAction='registration'
)].eventDate"
is the jsonpath of the registration date in an RDAP domain search
response).</t>
<t>Therefore, this specification defines the "property-ref" element in
terms of names identifying RDAP properties. However, not all the RDAP properti
es are suitable to be used in sort criteria. These properties include:</t>
<ul>
<li>
<t>properties providing service information (e.g., links, notices,
and remarks)</t>
</li>
<li>
<t>multivalued properties (e.g., status, roles, and variants)</t>
</li>
<li>properties representing relationships to other objects (e.g., en
tities)</li>
</ul>
<t>On the contrary, properties expressed as values of other
properties (e.g., registration date) could be used in such a
context.</t>
<t>A list of properties an RDAP server <bcp14>MAY</bcp14> implement
is defined. The properties are divided into two groups:
object-common properties and object-specific properties.</t>
<t><list style="empty"> <ul>
<t>sort = &quot;sort=&quot; sortItem *( &quot;,&quot; sortItem )</t> <li><t>Object-common properties. Object-common properties are derive
<t>sortItem = property-ref [&quot;:&quot; ( &quot;a&quot; / &quot;d&quot; d from merging the "eventAction" and the "eventDate" properties. The following v
) ]</t> alues of the "sort" parameter are defined:</t>
<t>property-ref = ALPHA *( ALPHA / DIGIT / &quot;_&quot; ) </t>
</list></t>
<t>&quot;a&quot; means that an ascending sort MUST be applied, &quot;d&qu ot; means that a descending sort MUST be applied. If the sort direction is abse nt, an ascending sort MUST be applied.</t> <ul>
<t>The following are examples of RDAP queries including the &quot;sort&quot; <li>registrationDate
parameter:</t> </li>
<t>https://example.com/rdap/domains?name=example*.com&amp;sort=name</t> <li>reregistrationDate
</li>
<t>https://example.com/rdap/domains?name=example*.com&amp;sort=registrationD <li>lastChangedDate
ate:d</t> </li>
<t>https://example.com/rdap/domains?name=example*.com&amp;sort=lockedDate,na <li>expirationDate
me</t> </li>
<t>Except for sorting IP addresses and values denoting dates and times, serv <li>deletionDate
ers MUST implement sorting according to the JSON value type of the RDAP field th </li>
e sorting property refers to. That is, JSON strings MUST be sorted lexicographi
cally and JSON numbers MUST be sorted numerically. Values denoting dates and ti
mes MUST be sorted in chronological order. If IP addresses are represented as J
SON strings, they MUST be sorted based on their numeric conversion.</t>
<t>The conversion of an IPv4 address to a number is possible since each dotted f <li>reinstantiationDate
ormat IPv4 address is a representation of a number written in a 256-based manner </li>
: 192.168.0.1 means 1*256^0 + 0*256^1 + 168*256^2 + 192*256^3 = 3232235521. Sim
ilarly, an IPv6 address can be converted into a number by applying the base 655
36. Therefore, the numerical representation of the IPv6 address 2001:0db8:85a3:
0:0:8a2e:0370:7334 is 42540766452641154071740215577757643572. Builtin functions
and libraries for converting IP addresses into numbers are available in most kn
own programming languages and relational database management systems.</t>
<t>If the &quot;sort&quot; parameter presents an allowed sorting property, i <li>transferDate
t MUST be provided in the &quot;currentSort&quot; field of the &quot;sorting_met </li>
adata&quot; element.</t>
<section anchor="sorting_properties" title="Sorting Properties Declaration"> <li>lockedDate
<t>In the &quot;sort&quot; parameter ABNF syntax, the element named &quot;pr </li>
operty-ref&quot; represents a reference to a property of an RDAP object. Such a
reference could be expressed by using a JSONPath expression (named "jsonpath" i
n the following).</t>
<t>JSONPath is a syntax, originally based on the XML XPath notation <xref ta
rget="W3C.CR-xpath-31-20161213"/>, which represents a path to select an element
(or a set of elements) in a JSON document <xref target="RFC8259"/>. For example
, the jsonpath to select the value of the ASCII name inside an RDAP domain looku
p response is &quot;$.ldhName&quot;, where $ identifies the root of the document
object model (DOM). Another way to select a value inside a JSON document is th
e JSON Pointer <xref target="RFC6901"/>.</t>
<t>While JSONPath or JSON Pointer are both commonly adopted notations to sel
ect any value inside JSON data, neither is particularly coincise and easy to use
(e.g. &quot;$.domainSearchResults[*].events[?(@.eventAction=&apos;registration&
apos;)].eventDate&quot; is the jsonpath of the registration date in an RDAP doma
in search response).</t>
<t>Therefore, this specification defines the &quot;property-ref&quot; ele <li>unlockedDate
ment in terms of names identifying RDAP properties. However, not all the RDAP p </li>
roperties are suitable to be used in sort criteria, such as:</t>
<t><list style="symbols"> </ul>
<t>properties providing service information (e.g. links, notices, remar
ks);<vspace blankLines='1' /></t>
<t>multivalued properties (e.g. status, roles, variants);<vspace blankL
ines='1' /></t>
<t>properties representing relationships to other objects (e.g. entitie
s).</t>
</list></t>
<t>On the contrary, properties expressed as values of other properties (e .g. registration date) could be used in such a context.</t> </li>
<t>A list of properties an RDAP server MAY implement is defined. The proper <li><t>Object-specific properties. Note that some of these properties are also d
ties are divided into two groups: object common properties and object specific p efined as query path segments. These properties include:</t>
roperties.</t> <ul>
<li>Domain: name
</li>
<t><list style="symbols"> <li>Nameserver: name, ipv4, ipv6
<t>Object common properties. Object common properties are derived from </li>
merging the &quot;eventAction&quot; and the &quot;eventDate&quot; properties.
The following values of the &quot;sort&quot; parameter are defined:
<list style="symbols">
<t>registrationDate</t>
<t>reregistrationDate</t>
<t>lastChangedDate</t>
<t>expirationDate</t>
<t>deletionDate</t>
<t>reinstantiationDate</t>
<t>transferDate</t>
<t>lockedDate</t>
<t>unlockedDate</t>
</list></t>
</list></t>
<t><list style="symbols">
<t>Object specific properties. Note that some of these properties are
also defined as query path segments. These properties include:
<list style="symbols">
<t>Domain: name</t>
<t>Nameserver: name, ipv4, ipv6.</t>
<t>Entity: fn, handle, org, email, voice, country, cc, city.</t>
</list></t>
</list></t>
<t>The correspondence between these sorting properties and the RDAP object c <li>Entity: fn, handle, org, email, voice, country, cc, city
lasses is shown in <xref target="table_sorting_properties_definition"/>. Some o </li>
f the sorting properties defined for the RDAP entity class are related to jCard
elements <xref target="RFC7095"/> but, being jCard the JSON format for vCard <xr
ef target="RFC6350"/>, the corresponding definitions are included in vCard speci
fication.</t>
<t>An RDAP server MUST NOT use the defined sorting properties with a meaning other than the one described in <xref target="table_sorting_properties_definiti on"/>.</t> </ul>
<texttable anchor="table_sorting_properties_definition" title="Sorting prope </li>
rties definition"> </ul>
<ttcol align="left">Object class</ttcol>
<ttcol align="left">Sorting property</ttcol>
<ttcol align="left">RDAP property</ttcol>
<ttcol align="left">RFC 7483</ttcol>
<ttcol align="left">RFC 6350</ttcol>
<ttcol align="left">RFC 8605</ttcol>
<c>Searchable objects</c><c>Common properties</c><c>eventAction values su
ffixed by &quot;Date&quot;</c><c>4.5</c><c></c><c></c>
<c></c><c></c><c></c><c></c><c></c><c></c>
<c>Domain</c><c>name</c><c>unicodeName/ ldhName</c><c>5.3</c><c></c><c></
c>
<c></c><c></c><c></c><c></c><c></c><c></c>
<c>Nameserver</c><c>name</c><c>unicodeName/ ldhName</c><c>5.2</c><c></c><
c></c>
<c></c><c>ipv4</c><c>v4 ipAddress</c><c>5.2</c><c></c><c></c>
<c></c><c>ipv6</c><c>v6 ipAddress</c><c>5.2</c><c></c><c></c>
<c></c><c></c><c></c><c></c><c></c><c></c>
<c>Entity</c><c>handle</c><c>handle</c><c>5.1</c><c></c><c></c>
<c></c><c>fn</c><c>jCard fn</c><c>5.1</c><c>6.2.1</c><c></c>
<c></c><c>org</c><c>jCard org</c><c>5.1</c><c>6.6.4</c><c></c>
<c></c><c>voice</c><c>jCard tel with type=&quot;voice&quot;</c><c>5.1</c>
<c>6.4.1</c><c></c>
<c></c><c>email</c><c>jCard email</c><c>5.1</c><c>6.4.2</c><c></c>
<c></c><c>country</c><c>country name in jCard adr</c><c>5.1</c><c>6.3.1</
c><c></c>
<c></c><c>cc</c><c>country code in jCard adr</c><c>5.1</c><c></c><c>3.1</
c>
<c></c><c>city</c><c>locality in jCard adr</c><c>5.1</c><c>6.3.1</c><c></
c>
</texttable>
<t>Regarding the definitions in <xref target="table_sorting_properties_de <t>The correspondence between these sorting properties and the RDAP
finition"/>, some further considerations are needed to disambiguate some cases:< object classes is shown in <xref
/t> target="table_sorting_properties_definition"/>. Some of the sorting
<t><list style="symbols"> properties defined for the RDAP entity class are related to jCard
<t>since the response to a search on either domains or nameservers might elements <xref target="RFC7095"/>, but because jCard is the JSON forma
include both A-labels and U-labels <xref target="RFC5890"/> in general, a consi t
stent sorting policy MUST treat the unicodeName and ldhName as two representatio for vCard, the corresponding definitions
ns of the same value. The unicodeName value MUST be used while sorting if it is are included in the vCard specification <xref target="RFC6350"/>.</t>
present; when the unicodeName is unavailable, the value of the ldhName MUST be <t>An RDAP server <bcp14>MUST NOT</bcp14> use the defined sorting
used instead;<vspace blankLines='1' /></t> properties with a meaning other than that described in <xref
<t>the jCard &quot;sort-as&quot; parameter MUST be ignored for the sorti target="table_sorting_properties_definition"/>.</t>
ng capability described in this document;<vspace blankLines='1' /></t> <table anchor="table_sorting_properties_definition">
<t>even if a nameserver can have multiple IPv4 and IPv6 addresses, the <name>Definitions of Sorting Properties</name>
most common configuration includes one address for each IP version. Therefore, <thead>
this specification makes the assumption that nameservers have a single IPv4 and/ <tr>
or IPv6 value. When more than one address per IP version is presented, sorting <th align="left">Object class</th>
MUST be applied to the first value;<vspace blankLines='1' /></t> <th align="left">Sorting property</th>
<t>multiple events with a given action on an object might be returned. I <th align="left">RDAP property</th>
f this occurs, sorting MUST be applied to the most recent event;<vspace blankLin <th align="left">RFC 7483</th>
es='1' /></t> <th align="left">RFC 6350</th>
<t>except for handle values, all the sorting properties defined for entit <th align="left">RFC 8605</th>
y objects can be multivalued according to the definition of vCard as given in <x </tr>
ref target="RFC6350"/>. When more than one value is presented, sorting MUST be </thead>
applied to the preferred value identified by the parameter pref=&quot;1&quot;. <tbody>
If the pref parameter is missing, sorting MUST be applied to the first value.</t <tr>
> <td align="left">Searchable objects</td>
</list></t> <td align="left">Common properties</td>
<td align="left">eventAction values suffixed by "Date"</td>
<td align="left"><xref target="RFC7483" section="4.5" sectionFor
mat="bare"/></td>
<td align="left"/>
<td align="left"/>
</tr>
<t>The &quot;jsonPath&quot; field in the &quot;sorting_metadata&quot; el <tr>
ement is used to clarify the RDAP response field the sorting property refers to. <td align="left">Domain</td>
The mapping between the sorting properties and the jsonpaths of the RDAP respo <td align="left">name</td>
nse fields is shown below. The JSONPath operators used herein are described in <td align="left">unicodeName/ ldhName</td>
<xref target="jsonpath-operators"/>.</t> <td align="left"><xref target="RFC7483" section="5.3" sectionFor
mat="bare"/></td>
<td align="left"/>
<td align="left"/>
</tr>
<t><list style="symbols"> <tr>
<t>Searchable objects <td align="left">Nameserver</td>
<list style="hanging"> <td align="left">name</td>
<t hangText="registrationDate"><vspace blankLines='1' />$.domainSe <td align="left">unicodeName/ ldhName</td>
archResults[*].events[?(@.eventAction==&quot;registration&quot;)].eventDate<vspa <td align="left"><xref target="RFC7483" section="5.2" sectionFor
ce blankLines='1' /></t> mat="bare"/></td>
<t hangText="reregistrationDate"><vspace blankLines='1' />$.domain <td align="left"/>
SearchResults[*].events[?(@.eventAction==&quot;reregistration&quot;)].eventDate< <td align="left"/>
vspace blankLines='1' /></t> </tr>
<t hangText="lastChangedDate"><vspace blankLines='1' />$.domainSea <tr>
rchResults[*].events[?(@.eventAction==&quot;last changed&quot;)].eventDate<vspac <td align="left"/>
e blankLines='1' /></t> <td align="left">ipv4</td>
<t hangText="expirationDate"><vspace blankLines='1' />$.domainSear <td align="left">v4 ipAddress</td>
chResults[*].events[?(@.eventAction==&quot;expiration&quot;)].eventDate<vspace b <td align="left"><xref target="RFC7483" section="5.2" sectionFor
lankLines='1' /></t> mat="bare"/></td>
<t hangText="deletionDate"><vspace blankLines='1' />$.domainSearch <td align="left"/>
Results[*].events[?(@.eventAction==&quot;deletion&quot;)].eventDate<vspace blank <td align="left"/>
Lines='1' /></t> </tr>
<t hangText="reinstantiationDate"><vspace blankLines='1' />$.domai <tr>
nSearchResults[*].events[?(@.eventAction==&quot;reinstantiation&quot;)].eventDat <td align="left"/>
e<vspace blankLines='1' /></t> <td align="left">ipv6</td>
<t hangText="transferDate"><vspace blankLines='1' />$.domainSearch <td align="left">v6 ipAddress</td>
Results[*].events[?(@.eventAction==&quot;transfer&quot;)].eventDate<vspace blank <td align="left"><xref target="RFC7483" section="5.2" sectionFor
Lines='1' /></t> mat="bare"/></td>
<t hangText="lockedDate"><vspace blankLines='1' />$.domainSearchRe <td align="left"/>
sults[*].events[?(@.eventAction==&quot;locked&quot;)].eventDate<vspace blankLine <td align="left"/>
s='1' /></t> </tr>
<t hangText="unlockedDate"><vspace blankLines='1' />$.domainSearch
Results[*].events[?(@.eventAction==&quot;unlocked&quot;)].eventDate<vspace blank
Lines='1' /></t>
</list>
</t>
<t>Domain
<list style="hanging">
<t hangText="name"><vspace blankLines='1' />$.domainSearchResu
lts[*].[unicodeName,ldhName]<vspace blankLines='1' /></t>
</list>
</t>
<t>Nameserver
<list style="hanging">
<t hangText="name"><vspace blankLines='1' />$.nameserverSearch
Results[*].[unicodeName,ldhName]<vspace blankLines='1' /></t>
<t hangText="ipv4"><vspace blankLines='1' />$.nameserverSearch
Results[*].ipAddresses.v4[0]<vspace blankLines='1' /></t>
<t hangText="ipv6"><vspace blankLines='1' />$.nameserverSearch
Results[*].ipAddresses.v6[0]<vspace blankLines='1' /></t>
</list>
</t>
<t>Entity
<list style="hanging">
<t hangText="handle"><vspace blankLines='1' />$.entitySearchRe
sults[*].handle<vspace blankLines='1' /></t>
<t hangText="fn"><vspace blankLines='1' />$.entitySearchResult
s[*].vcardArray[1][?(@[0]==&quot;fn&quot;)][3]<vspace blankLines='1' /></t>
<t hangText="org"><vspace blankLines='1' />$.entitySearchResul
ts[*].vcardArray[1][?(@[0]==&quot;org&quot;)][3]<vspace blankLines='1' /></t>
<t hangText="voice"><vspace blankLines='1' />$.entitySearchRes
ults[*].vcardArray[1][?(@[0]==&quot;tel&quot; &amp;&amp; @[1].type==&quot;voice&
quot;)][3]<vspace blankLines='1' /></t>
<t hangText="email"><vspace blankLines='1' />$.entitySearchRes
ults[*].vcardArray[1][?(@[0]==&quot;email&quot;)][3]<vspace blankLines='1' /></t
>
<t hangText="country"><vspace blankLines='1' />$.entitySearchR
esults[*].vcardArray[1][?(@[0]==&quot;adr&quot;)][3][6]<vspace blankLines='1' />
</t>
<t hangText="cc"><vspace blankLines='1' />$.entitySearchResult
s[*].vcardArray[1][?(@[0]==&quot;adr&quot;)][1].cc<vspace blankLines='1' /></t>
<t hangText="city"><vspace blankLines='1' />$.entitySearchResu
lts[*].vcardArray[1][?(@[0]==&quot;adr&quot;)][3][3]<vspace blankLines='1' /></t
>
</list>
</t>
</list></t>
<t>Additional notes on the provided jsonpaths:</t> <tr>
<t><list style="symbols"> <td align="left">Entity</td>
<t>those related to the event dates are defined only for the &quot;domain <td align="left">handle</td>
&quot; object. To obtain the equivalent jsonpaths for &quot;entity&quot; and &q <td align="left">handle</td>
uot;nameserver&quot;, the path segment &quot;domainSearchResults&quot; must be r <td align="left"><xref target="RFC7483" section="5.1" sectionFor
eplaced with &quot;entitySearchResults&quot; and &quot;nameserverSearchResults&q mat="bare"/></td>
uot; respectively;<vspace blankLines='1' /></t> <td align="left"/>
<t>those related to jCard elements are specified without taking into acco <td align="left"/>
unt the &quot;pref&quot; parameter. Servers that sort those values identified b </tr>
y the pref parameter SHOULD update a jsonpath by adding an appropriate filter. <tr>
For example, if the email values identified by pref=&quot;1&quot; are considered <td align="left"/>
for sorting, the jsonpath of the &quot;email&quot; sorting property should be: <td align="left">fn</td>
$.entitySearchResults[*].vcardArray[1][?(@[0]==&quot;email&quot; &amp;&amp; @[1] <td align="left">jCard fn</td>
.pref==&quot;1&quot;)][3]</t> <td align="left"><xref target="RFC7483" section="5.1" sectionFor
</list></t> mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.2.1" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
<tr>
<td align="left"/>
<td align="left">org</td>
<td align="left">jCard org</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.6.4" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
<tr>
<td align="left"/>
<td align="left">voice</td>
<td align="left">jCard tel with type="voice"</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.4.1" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
<tr>
<td align="left"/>
<td align="left">email</td>
<td align="left">jCard email</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.4.2" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
<tr>
<td align="left"/>
<td align="left">country</td>
<td align="left">country name in jCard adr</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.3.1" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
<tr>
<td align="left"/>
<td align="left">cc</td>
<td align="left">country code in jCard adr</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"/>
<td align="left"><xref target="RFC8605" section="3.1" sectionFor
mat="bare"/></td>
</tr>
<tr>
<td align="left"/>
<td align="left">city</td>
<td align="left">locality in jCard adr</td>
<td align="left"><xref target="RFC7483" section="5.1" sectionFor
mat="bare"/></td>
<td align="left"><xref target="RFC6350" section="6.3.1" sectionF
ormat="bare"/></td>
<td align="left"/>
</tr>
</tbody>
</table>
<t>Regarding the definitions in <xref target="table_sorting_properties
_definition"/>, some further considerations are needed to disambiguate some case
s:</t>
<ul>
<li>
<t>Since the response to a search on either domains or nameservers
might include both A-labels and U-labels <xref target="RFC5890"/> in general, a
consistent sorting policy <bcp14>MUST</bcp14> treat the unicodeName and ldhName
as two representations of the same value. The unicodeName value <bcp14>MUST</b
cp14> be used while sorting if it is present; when the unicodeName is unavailabl
e, the value of the ldhName <bcp14>MUST</bcp14> be used instead.</t>
</li>
<li>
<t>The jCard "sort-as" parameter <bcp14>MUST</bcp14> be ignored fo
r the sorting capability described in this document.</t>
</li>
<li>
<t>Even if a nameserver can have multiple IPv4 and IPv6 addresses,
the most common configuration includes one address for each IP version. Theref
ore, this specification makes the assumption that nameservers have a single IPv4
and/or IPv6 value. When more than one address per IP version is presented, sor
ting <bcp14>MUST</bcp14> be applied to the first value.</t>
</li>
<li>
<t>Multiple events with a given action on an object might be retur
ned. If this occurs, sorting <bcp14>MUST</bcp14> be applied to the most recent
event.</t>
</section> </li>
<section anchor="sorting_links" title="Representing Sorting Links"> <li>Except for handle values, all the sorting properties defined for
<t>An RDAP server MAY use the &quot;links&quot; array of the &quot;sortin entity objects can be multivalued according to the definition of vCard as given
g_metadata&quot; element to provide ready-made references <xref target="RFC8288" in <xref target="RFC6350"/>. When more than one value is presented, sorting <b
/> to the available sort criteria (<xref target="sort-link-in-response-example"/ cp14>MUST</bcp14> be applied to the preferred value identified by the parameter
>). Each link represents a reference to an alternate view of the results.</t> pref="1". If the "pref" parameter is missing, sorting <bcp14>MUST</bcp14> be ap
plied to the first value.</li>
</ul>
<t>The "jsonPath" field in the "sorting_metadata" element is used to c
larify the RDAP response field the sorting property refers to. The mapping betw
een the sorting properties and the jsonpaths of the RDAP response fields is show
n below. The JSONPath operators used herein are described in <xref target="json
path-operators"/>.</t>
<ul >
<li>
<t>Searchable objects
</t>
<dl newline="true">
<dt>registrationDate</dt>
<t>The &quot;value&quot;, &quot;rel&quot; and &quot;href&quot; JSON values MUST <dd>
be specified. All other JSON values are OPTIONAL.</t> <t>$.domainSearchResults[*].events[?(@.eventAction=="registration")].eventDate</
t>
</dd>
<dt>reregistrationDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="reregistr
ation")].eventDate</t>
<figure anchor="sort-link-in-response-example" title="Example of a &quot;s </dd>
orting_metadata&quot; instance to implement result sorting"> <dt>lastChangedDate</dt>
<artwork xml:space="preserve"><![CDATA[ <dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="last chan
ged")].eventDate</t>
</dd>
<dt>expirationDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="expiratio
n")].eventDate</t>
</dd>
<dt>deletionDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="deletion"
)].eventDate</t>
</dd>
<dt>reinstantiationDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="reinstant
iation")].eventDate</t>
</dd>
<dt>transferDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="transfer"
)].eventDate</t>
</dd>
<dt>lockedDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="locked")]
.eventDate</t>
</dd>
<dt>unlockedDate</dt>
<dd>
<t>$.domainSearchResults[*].events[?(@.eventAction=="unlocked"
)].eventDate</t>
</dd>
</dl>
</li>
<li>
<t>Domain
</t>
<dl newline="true">
<dt>name</dt>
<dd>
<t>$.domainSearchResults[*].[unicodeName,ldhName]</t>
</dd>
</dl>
</li>
<li>
<t>Nameserver
</t>
<dl newline="true">
<dt>name</dt>
<dd>
<t>$.nameserverSearchResults[*].[unicodeName,ldhName]</t>
</dd>
<dt>ipv4</dt>
<dd>
<t>$.nameserverSearchResults[*].ipAddresses.v4[0]</t>
</dd>
<dt>ipv6</dt>
<dd>
<t>$.nameserverSearchResults[*].ipAddresses.v6[0]</t>
</dd>
</dl>
</li>
<li>
<t>Entity
</t>
<dl newline="true">
<dt>handle</dt>
<dd>
<t>$.entitySearchResults[*].handle</t>
</dd>
<dt>fn</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="fn")][3]</t
>
</dd>
<dt>org</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="org")][3]</
t>
</dd>
<dt>voice</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="tel" &amp;&
amp; @[1].type=="voice")][3]</t>
</dd>
<dt>email</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="email")][3]
</t>
</dd>
<dt>country</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="adr")][3][6
]</t>
</dd>
<dt>cc</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="adr")][1].c
c</t>
</dd>
<dt>city</dt>
<dd>
<t>$.entitySearchResults[*].vcardArray[1][?(@[0]=="adr")][3][3
]</t>
</dd>
</dl>
</li>
</ul>
<t>Additional notes on the provided jsonpaths:</t>
<ul>
<li>
<t>Those related to the event dates are defined only for the
"domain" object. To obtain the equivalent jsonpaths for
"entity" and "nameserver", the path segment
"domainSearchResults" must be replaced with
"entitySearchResults" and "nameserverSearchResults",
respectively.</t>
</li>
<li>Those related to jCard elements are specified without taking
into account the "pref" parameter. Servers that sort those values
identified by the "pref" parameter <bcp14>SHOULD</bcp14> update a
jsonpath by adding an appropriate filter. For example, if the
email values identified by pref="1" are considered for sorting,
the jsonpath of the "email" sorting property should be
$.entitySearchResults[*].vcardArray[1][?(@[0]=="email" &amp;&amp;
@[1].pref=="1")][3].</li>
</ul>
</section>
<section anchor="sorting_links">
<name>Representing Sorting Links</name>
<t>An RDAP server <bcp14>MAY</bcp14> use the "links" array of the "sor
ting_metadata" element to provide ready-made references <xref target="RFC8288"/>
to the available sort criteria (<xref target="sort-link-in-response-example"/>)
. Each link represents a reference to an alternate view of the results.</t>
<t>The "value", "rel", and "href" JSON values <bcp14>MUST</bcp14> be s
pecified. All other JSON values are <bcp14>OPTIONAL</bcp14>.</t>
<figure anchor="sort-link-in-response-example">
<name>Example of a "sorting_metadata" Instance to Implement Result S
orting</name>
<sourcecode type="json">
{ {
"rdapConformance": [ "rdapConformance": [
"rdap_level_0", "rdap_level_0",
"sorting" "sorting"
], ],
... ...
"sorting_metadata": { "sorting_metadata": {
"currentSort": "name", "currentSort": "name",
"availableSorts": [ "availableSorts": [
{ {
"property": "registrationDate", "property": "registrationDate",
"jsonPath": "$.domainSearchResults[*] "jsonPath": "$.domainSearchResults[*]
.events[?(@.eventAction==\"registration\")].eventDate", .events[?(@.eventAction==\"registration\")].eventDate",
"default": false, "default": false,
"links": [ "links": [
{ {
"value": "https://example.com/rdap/domains?name=example*.com "value": "https://example.com/rdap/domains?name=example*.com
&sort=name", &amp;sort=name",
"rel": "alternate", "rel": "alternate",
"href": "https://example.com/rdap/domains?name=example*.com "href": "https://example.com/rdap/domains?name=example*.com
&sort=registrationDate", &amp;sort=registrationDate",
"title": "Result Ascending Sort Link", "title": "Result Ascending Sort Link",
"type": "application/rdap+json" "type": "application/rdap+json"
}, },
{ {
"value": "https://example.com/rdap/domains?name=example*.com "value": "https://example.com/rdap/domains?name=example*.com
&sort=name", &amp;sort=name",
"rel": "alternate", "rel": "alternate",
"href": "https://example.com/rdap/domains?name=example*.com "href": "https://example.com/rdap/domains?name=example*.com
&sort=registrationDate:d", &amp;sort=registrationDate:d",
"title": "Result Descending Sort Link", "title": "Result Descending Sort Link",
"type": "application/rdap+json" "type": "application/rdap+json"
} }
] ]
}, },
... ...
] ]
}, },
"domainSearchResults": [ "domainSearchResults": [
... ...
] ]
} }
]]></artwork> </sourcecode>
</figure> </figure>
</section> </section>
</section>
</section> <section anchor="cursor-parameter">
<name>"cursor" Parameter</name>
<section anchor="cursor-parameter" title="&quot;cursor&quot; Parameter">
<t>The cursor parameter defined in this specification can be used to enco
de information about any pagination method. For example, in the case of a simpl
e implementation of the cursor parameter to represent offset pagination informat
ion, the cursor value &quot;b2Zmc2V0PTEwMCxsaW1pdD01MA==&quot; is the Base64 enc
oding of &quot;offset=100,limit=50&quot;. Likewise, in a simple implementation
to represent keyset pagination information, the cursor value &quot;ZXhhbXBsZS1OL
mNvbQ==&quot; represents the Base64 encoding of &quot;key=example-N.com&quot; wh
ereby the key value identifies the last row of the current page.</t>
<t>Note that this specification uses a Base64 encoding for cursor obfuscatio
n just for example. RDAP servers are NOT RECOMMENDED to obfuscate a cursor valu
e through a mere Base64 encoding.</t>
<t>This solution lets RDAP providers implement a pagination method accord <t>The "cursor" parameter defined in this specification can be used to
ing to their needs, a user's access level, and the submitted query. Besides, se encode information about any pagination method. For example, in the
rvers can change the method over time without announcing anything to clients. T case of a simple implementation of the "cursor" parameter to represent
he considerations that have led to this solution are described in more detail in offset pagination information, the "cursor" value
<xref target="approaches-to-result-pagination"/>.</t> "b2Zmc2V0PTEwMCxsaW1pdD01MA==" is the base64 encoding of
"offset=100,limit=50". Likewise, in a simple implementation to
represent keyset pagination information, the "cursor" value
"ZXhhbXBsZS1OLmNvbQ==" represents the base64 encoding of
"key=example-N.com" whereby the key value identifies the last row of
the current page.</t>
<t>The ABNF syntax of the cursor parameter is the following:</t> <t>Note that this specification uses a base64 encoding for cursor
<t><list style="empty"> obfuscation just for example. RDAP servers are <bcp14>NOT
<t>cursor = &quot;cursor=&quot; 1*( ALPHA / DIGIT / &quot;/&quot; RECOMMENDED</bcp14> to obfuscate the "cursor" value through a mere
/ &quot;=&quot; / &quot;-&quot; / &quot;_&quot; )</t> base64 encoding.</t>
</list></t>
<t>The following is an example of an RDAP query including the &quot;cursor <t>This solution lets RDAP providers implement a pagination method
&quot; parameter:</t> according to their needs, a user's access level, and the submitted
query. Besides, servers can change the method over time without
announcing anything to clients. The considerations that have led to
this solution are described in more detail in <xref
target="approaches-to-result-pagination"/>.</t>
<t>https://example.com/rdap/domains?name=example*.com <t>The ABNF syntax of the "cursor" parameter is the following:</t>
<sourcecode type="abnf">
cursor = "cursor=" 1*( ALPHA / DIGIT / "/" / "=" / "-" / "_" )
</sourcecode>
<t>The following is an example of an RDAP query including the "cursor" p
arameter:</t>
<t>https://example.com/rdap/domains?name=example*.com
&amp;cursor=wJlCDLIl6KTWypN7T6vc6nWEmEYe99Hjf1XY1xmqV-M= &amp;cursor=wJlCDLIl6KTWypN7T6vc6nWEmEYe99Hjf1XY1xmqV-M=
</t> </t>
<section anchor="cursor_paging_links">
<section anchor="cursor_paging_links" title="Representing Paging Links"> <name>Representing Paging Links</name>
<t>An RDAP server <bcp14>SHOULD</bcp14> use the "links" array of the "
<t>An RDAP server SHOULD use the &quot;links&quot; array of the &quot;pag paging_metadata" element to provide a ready-made reference <xref target="RFC8288
ing_metadata&quot; element to provide a ready-made reference <xref target="RFC82 "/> to the next page of the result set (<xref target="cursor-pagination-link-in-
88"/> to the next page of the result set (<xref target="cursor-pagination-link-i response-example"/>). Examples of additional "rel" values a server <bcp14>MAY</
n-response-example"/>). Examples of additional &quot;rel&quot; values a server bcp14> implement are "first", "last", and "prev".</t>
MAY implement are &quot;first&quot;, &quot;last&quot;, and &quot;prev&quot;.</t> <figure anchor="cursor-pagination-link-in-response-example">
<name>Example of a "paging_metadata" Instance to Implement Cursor Pa
<figure anchor="cursor-pagination-link-in-response-example" title="Example gination</name>
of a &quot;paging_metadata&quot; instance to implement cursor pagination"> <sourcecode type="json">
<artwork xml:space="preserve"><![CDATA[
{ {
"rdapConformance": [ "rdapConformance": [
"rdap_level_0", "rdap_level_0",
"paging" "paging"
], ],
... ...
"notices": [ "notices": [
{ {
"title": "Search query limits", "title": "Search query limits",
"type": "result set truncated due to excessive load", "type": "result set truncated due to excessive load",
skipping to change at line 496 skipping to change at line 818
], ],
"paging_metadata": { "paging_metadata": {
"totalCount": 73, "totalCount": 73,
"pageSize": 50, "pageSize": 50,
"pageNumber": 1, "pageNumber": 1,
"links": [ "links": [
{ {
"value": "https://example.com/rdap/domains?name=example*.com", "value": "https://example.com/rdap/domains?name=example*.com",
"rel": "next", "rel": "next",
"href": "https://example.com/rdap/domains?name=example*.com "href": "https://example.com/rdap/domains?name=example*.com
&cursor=wJlCDLIl6KTWypN7T6vc6nWEmEYe99Hjf1XY1xmqV-M=", &amp;cursor=wJlCDLIl6KTWypN7T6vc6nWEmEYe99Hjf1XY1xmqV-M=",
"title": "Result Pagination Link", "title": "Result Pagination Link",
"type": "application/rdap+json" "type": "application/rdap+json"
} }
] ]
}, },
"domainSearchResults": [ "domainSearchResults": [
... ...
] ]
} }
]]></artwork> </sourcecode>
</figure> </figure>
</section>
</section> </section>
</section>
</section> <section anchor="negative-answers">
<name>Negative Answers</name>
</section>
<section anchor="negative-answers" title="Negative Answers"> <t>The constraints for the values of parameters are defined by their ABNF
<t>The constraints for the parameters values are defined by their ABNF syn syntax. Therefore, each request that includes an invalid value for a
tax. Therefore, each request that includes an invalid value for a parameter SHO parameter <bcp14>SHOULD</bcp14> produce an HTTP 400 (Bad Request)
ULD produce an HTTP 400 (Bad Request) response code. The same response SHOULD b response code. The same response <bcp14>SHOULD</bcp14> be returned in
e returned in the following cases: the following cases:
<list style="symbols"> </t>
<t>if in both single and multi sort the client provides an unsupported value for <ul>
the &quot;sort&quot; parameter, as well as a value related to an object propert
y not included in the response;<vspace blankLines='1' /></t>
<t>if the client submits an invalid value for the &quot;cursor&quot; parameter.<
/t>
</list></t>
<t>Optionally, the response MAY include additional information regarding <li>
either the supported sorting properties or the correct cursor values in the HTTP <t>if sorting by either single or multiple properties, the client provides an
entity body (<xref target="sorting-property-error"/>).</t> unsupported value for the "sort" parameter, as well as a value related to an
object property not included in the response
</t>
<figure anchor="sorting-property-error" title="Example of RDAP error respo </li>
nse due to an invalid domain sorting property included in the request"> <li>if the client submits an invalid value for the "cursor" parameter</l
<artwork xml:space="preserve"> i>
</ul>
<t>Optionally, the response <bcp14>MAY</bcp14> include additional informat
ion regarding either the supported sorting properties or the correct "cursor" va
lue in the HTTP entity body (<xref target="sorting-property-error"/>).</t>
<figure anchor="sorting-property-error">
<name>Example of RDAP Error Response Due to an Invalid Domain Sorting Pr
operty Included in the Request</name>
<sourcecode type="json">
{ {
"errorCode": 400, "errorCode": 400,
"title": "Domain sorting property 'unknownproperty' is not valid", "title": "Domain sorting property 'unknown' is not valid",
"description": [ "description": [
"Supported domain sorting properties are: 'aproperty', 'anotherproperty' "Supported domain sorting properties are:"
." "'aproperty', 'anotherproperty'"
] ]
} }
</artwork> </sourcecode>
</figure> </figure>
</section> </section>
<section anchor="implementation-considerations">
<name>Implementation Considerations</name>
<t>Implementation of the new parameters is technically feasible, as
operators for counting, sorting, and paging are currently supported by
the major relational database management systems. Similar operators are
completely or partially supported by the most well-known NoSQL databases
(e.g., MongoDB, CouchDB, HBase, Cassandra, Hadoop, etc.). Additional
implementation notes are included in <xref
target="additional-implementation-notes"/>.</t>
</section>
<section anchor="IANA-considerations">
<name>IANA Considerations</name>
<section anchor="implementation-considerations" title="Implementation Conside <t>IANA has registered the following values in the "RDAP Extensions"
rations"> registry:</t>
<t>Implementation of the new parameters is technically feasible, as operat
ors for counting, sorting and paging are currently supported by the major relati
onal database management systems. Similar operators are completely or partially
supported by the most well-known NoSQL databases (e.g. MongoDB, CouchDB, HBase,
Cassandra, Hadoop). Additional implementation notes are included in <xref targ
et="additional-implementation-notes"/>.</t>
</section>
<section anchor="IANA-considerations" title="IANA Considerations"> <dl spacing="compact">
<t>IANA is requested to register the following values in the RDAP Extensi <dt>Extension identifier:
ons Registry:</t> </dt>
<dd>paging
</dd>
<t><list style="none"> <dt>Registry operator:
<t>Extension identifier: paging</t> </dt>
<t>Registry operator: Any</t> <dd>Any
<t>Published specification: This document.</t> </dd>
<t>Contact: IETF &lt;iesg@ietf.org&gt;</t>
<t>Intended usage: This extension describes best practice for result set p
aging.</t>
</list></t>
<t><list style="none"> <dt>Published specification:
<t>Extension identifier: sorting</t> </dt>
<t>Registry operator: Any</t> <dd>RFC 8977
<t>Published specification: This document.</t> </dd>
<t>Contact: IETF &lt;iesg@ietf.org&gt;</t>
<t>Intended usage: This extension describes best practice for result set s
orting.</t>
</list></t>
</section> <dt>Contact:
</dt>
<dd>IETF &lt;iesg@ietf.org&gt;
</dd>
<section anchor="impl-status" title="Implementation Status"> <dt>Intended usage:
<t>NOTE: Please remove this section and the reference to RFC 7942 prior to </dt>
publication as an RFC.</t> <dd>This extension describes a best practice for result set paging.
</dd>
<t>This section records the status of known implementations of the protoco l defined by this specification at the time of posting of this Internet-Draft, a nd is based on a proposal described in <xref target="RFC7942"/>. The descriptio n of implementations in this section is intended to assist the IETF in its decis ion processes in progressing drafts to RFCs. Please note that the listing of an y individual implementation here does not imply endorsement by the IETF. Furthe rmore, no effort has been spent to verify the information presented here that wa s supplied by IETF contributors. This is not intended as, and must not be const rued to be, a catalog of available implementations or their features. Readers a re advised to note that other implementations may exist.</t> </dl>
<t>According to RFC 7942, &quot;this will allow reviewers and working grou ps to assign due consideration to documents that have the benefit of running cod e, which may serve as evidence of valuable experimentation and feedback that hav e made the implemented protocols more mature. It is up to the individual workin g groups to use this information as they see fit&quot;.</t> <dl spacing="compact">
<section anchor="iit-cnr-registro-it" title="IIT-CNR/Registro.it"> <dt>Extension identifier:
<t><list style="none"> </dt>
<t>Responsible Organization: Institute of Informatics and Telematics of <dd>sorting
the National Research Council (IIT-CNR)/Registro.it</t> </dd>
<t>Location: https://rdap.pubtest.nic.it/</t>
<t>Description: This implementation includes support for RDAP queries u
sing data from .it public test environment.</t>
<t>Level of Maturity: This is an "alpha" test implementation.</t>
<t>Coverage: This implementation includes all of the features described
in this specification.</t>
<t>Contact Information: Mario Loffredo, mario.loffredo@iit.cnr.it</t>
</list></t>
</section>
<section anchor="apnic" title="APNIC"> <dt>Registry operator:
<t><list style="none"> </dt>
<t>Responsible Organization: Asia-Pacific Network Information Centre</t <dd>Any
> </dd>
<t>Location: https://github.com/APNIC-net/rdap-rmp-demo/tree/sorting-an
d-paging</t>
<t>Description: A proof-of-concept for RDAP mirroring.</t>
<t>Level of Maturity: This is a proof-of-concept implementation.</t>
<t>Coverage: This implementation includes all of the features described
in the specification except for nameserver sorting and unicodeName sorting.</t>
<t>Contact Information: Tom Harrison, tomh@apnic.net</t>
</list></t>
</section>
</section> <dt>Published specification:
</dt>
<dd>RFC 8977
</dd>
<section anchor="security-considerations" title="Security Considerations"> <dt>Contact:
<t>Security services for the operations specified in this document are des </dt>
cribed in <xref target="RFC7481"/>.</t> <dd>IETF &lt;iesg@ietf.org&gt;
</dd>
<t>A search query typically requires more server resources (such as memory <dt>Intended usage:
, CPU cycles, and network bandwidth) when compared to a lookup query. This incr </dt>
eases the risk of server resource exhaustion and subsequent denial of service. <dd>This extension describes a best practice for result set sorting.
This risk can be mitigated by either restricting search functionality or limitin </dd>
g the rate of search requests. Servers can also reduce their load by truncating
the results in a response. However, this last security policy can result in a
higher inefficiency or risk due to acting on incomplete information if the RDAP
server does not provide any functionality to return the truncated results.</t>
<t>The new parameters presented in this document provide RDAP operators wi </dl>
th a way to implement a server that reduces inefficiency risks. The &quot;count
&quot; parameter gives the client the ability to evaluate the completeness of a </section>
response. The &quot;sort&quot; parameter allows the client to obtain the most r
elevant information at the beginning of the result set. This can reduce the num
ber of unnecessary search requests. Finally, the &quot;cursor&quot; parameter e
nables the user to scroll the result set by submitting a sequence of sustainable
queries within server-acceptable limits.</t>
</section>
<section anchor="security-considerations">
<name>Security Considerations</name>
<t>Security services for the operations specified in this document are des
cribed in <xref target="RFC7481"/>.</t>
<t>A search query typically requires more server resources (such as memory
, CPU cycles, and network bandwidth) when compared to a lookup query. This incr
eases the risk of server resource exhaustion and subsequent denial of service.
This risk can be mitigated by either restricting search functionality or limitin
g the rate of search requests. Servers can also reduce their load by truncating
the results in a response. However, this last security policy can result in a
higher inefficiency or risk due to acting on incomplete information if the RDAP
server does not provide any functionality to return the truncated results.</t>
<t>The new parameters presented in this document provide RDAP operators wi
th a way to implement a server that reduces inefficiency risks. The "count" par
ameter gives the client the ability to evaluate the completeness of a response.
The "sort" parameter allows the client to obtain the most relevant information
at the beginning of the result set. This can reduce the number of unnecessary s
earch requests. Finally, the "cursor" parameter enables the user to scroll the
result set by submitting a sequence of sustainable queries within server-accepta
ble limits.</t>
</section>
</middle> </middle>
<back> <back>
<references title="Normative References">
&RFC2119;
&RFC5234;
&RFC5890;
&RFC6350;
&RFC7095;
&RFC7230;
&RFC7231;
&RFC7480;
&RFC7481;
&RFC7482;
&RFC7483;
&RFC7942;
&RFC8174;
&RFC8259;
&RFC8288;
&RFC8605;
</references>
<references title="Informative References"> <references>
<reference anchor='CURSOR' target='https://www.sitepoint.com/paginating-real <name>References</name>
-time-data-cursor-based-pagination/'> <references>
<front> <name>Normative References</name>
<title>Paginating Real-Time Data with Keyset Pagination</title> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<author initials='R.' surname='Nimesh' fullname='Rakhitha Nimesh' FC.2119.xml"/>
> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
</author> FC.5234.xml"/>
<date year='2014' month='July' /> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
</front> FC.5890.xml"/>
</reference> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<reference anchor='CURSOR-API1' target='https://developers.facebook.com/docs FC.6350.xml"/>
/graph-api/using-graph-api'> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<front> FC.7095.xml"/>
<title>facebook for developers - Using the Graph API</title> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<author> FC.7230.xml"/>
<organization>facebook.com</organization> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
</author> FC.7231.xml"/>
<date year='2017' month='July' /> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
</front> FC.7480.xml"/>
</reference> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<reference anchor='CURSOR-API2' target='https://developer.twitter.com/en/doc FC.7481.xml"/>
s/ads/general/guides/pagination.html'> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<front> FC.7482.xml"/>
<title>Pagination</title> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
<author> FC.7483.xml"/>
<organization>twitter.com</organization>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
FC.8174.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
FC.8259.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
FC.8288.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R
FC.8605.xml"/>
</references>
<references>
<name>Informative References</name>
<reference anchor="CURSOR" target="https://www.sitepoint.com/paginating-
real-time-data-cursor-based-pagination/">
<front>
<title>Paginating Real-Time Data with Cursor Based Pagination</title
>
<author initials="R." surname="Nimesh" fullname="Rakhitha Nimesh">
</author> </author>
<date year='2017'/> <date year="2014" month="July"/>
</front> </front>
</reference> </reference>
<reference anchor='GOESSNER-JSON-PATH' target='http://goessner.net/artic
les/JsonPath/'> <reference anchor="CURSOR-API1" target="https://developers.facebook.com/
<front> docs/graph-api/using-graph-api">
<title>JSONPath - XPath for JSON</title> <front>
<author initials='S.' surname='Goessner' fullname='Stefan Goessn <title>Facebook for Developers -- Using the Graph API</title>
er'> <author>
<organization>Facebook</organization>
</author>
<date />
</front>
</reference>
<reference anchor="CURSOR-API2" target="https://developer.twitter.com/en
/docs/twitter-ads-api">
<front>
<title>Twitter Ads API</title>
<author>
<organization>Twitter</organization>
</author>
<date />
</front>
</reference>
<reference anchor="GOESSNER-JSON-PATH" target="https://goessner.net/arti
cles/JsonPath/">
<front>
<title>JSONPath - XPath for JSON</title>
<author initials="S." surname="Goessner" fullname="Stefan Goessner">
</author> </author>
<date year='2007'/> <date year="2007" month="February"/>
</front> </front>
</reference> </reference>
<reference anchor='HATEOAS' target='https://www.e4developer.com/2018/02/16/h
ateoas-simple-explanation/'> <reference anchor="HATEOAS" target="https://www.e4developer.com/2018/02/
<front> 16/hateoas-simple-explanation/">
<title>HATEOAS - a simple explanation</title> <front>
<author initials='B.' surname='Jedrzejewski' fullname='Bartosz Je <title>HATEOAS - a simple explanation</title>
drzejewski'> <author initials="B." surname="Jedrzejewski" fullname="Bartosz Jedrz
</author> ejewski">
<date year='2018'/>
</front>
</reference>
<reference anchor='JSONPATH-COMPARISON' target='https://cburgmer.github.io/j
son-path-comparison/'>
<front>
<title>JSONPath Comparison</title>
<author/>
<date year='2020'/>
</front>
</reference>
<reference anchor='JSONPATH-WG' target='https://datatracker.ietf.org/wg/json
path/documents/'>
<front>
<title>JSON Path (jsonpath)</title>
<author/>
<date year='2020'/>
</front>
</reference>
<reference anchor='OData-Part1' target='http://docs.oasis-open.org/odata/od
ata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protoc
ol-complete.pdf'>
<front>
<title>OData Version 4.0. Part 1: Protocol Plus Errata 03</title>
<author initials='M.' surname='Pizzo' fullname='Michael Pizzo'>
</author>
<author initials='R.' surname='Handl' fullname='Ralf Handl'>
</author> </author>
<author initials='M.' surname='Zurmuehl' fullname='Martin Zurmueh <date year="2018" month="February"/>
l'> </front>
</reference>
<reference anchor="JSONPATH-COMPARISON" target="https://cburgmer.github.
io/json-path-comparison/">
<front>
<title>JSONPath Comparison</title>
<author/>
<date />
</front>
</reference>
<reference anchor="JSONPATH-WG" target="https://datatracker.ietf.org/wg/
jsonpath/about/">
<front>
<title>JSON Path (jsonpath)</title>
<author><organization>IETF</organization></author>
<date/>
</front>
</reference>
<reference anchor="ODATA-PART1" target="https://docs.oasis-open.org/odat
a/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-pr
otocol-complete.pdf">
<front>
<title>OData Version 4.0. Part 1: Protocol Plus Errata 03</title>
<author initials="M." surname="Pizzo" fullname="Michael Pizzo">
</author> </author>
<date year='2016' month='June' /> <author initials="R." surname="Handl" fullname="Ralf Handl">
</front>
</reference>
<reference anchor='REST' target='http://www.ics.uci.edu/~fielding/pubs/disse
rtation/fielding_dissertation.pdf'>
<front>
<title>Architectural Styles and the Design of Network-based Softw
are Architectures</title>
<author initials='R.' surname='Fielding' fullname='Roy Thomas Fie
lding'>
<organization>PH.D. DISSERTATION, UNIVERSITY OF CALIFORNIA, IRVI
NE</organization>
</author> </author>
<date year='2000'/> <author initials="M." surname="Zurmuehl" fullname="Martin Zurmuehl">
</front>
</reference>
&RFC6901;
<reference anchor='SEEK' target='https://www.eversql.com/faster-pagination-i
n-mysql-why-order-by-with-limit-and-offset-is-slow/'>
<front>
<title>Faster Pagination in Mysql - Why Order By With Limit and O
ffset is Slow?</title>
<author>
<organization>EverSQL.com</organization>
</author> </author>
<date year='2017' month='July' /> <date year="2016" month="June"/>
</front> </front>
</reference> </reference>
&W3C.CR-xpath-31-20161213;
</references>
<section anchor="jsonpath-operators" title="JSONPath operators"> <reference anchor="REST" target="https://www.ics.uci.edu/~fielding/pubs/
dissertation/fielding_dissertation.pdf">
<front>
<title>Architectural Styles and the Design of Network-based Software
Architectures</title>
<author initials="R." surname="Fielding" fullname="Roy Thomas Fieldi
ng">
<organization>PH.D. DISSERTATION, UNIVERSITY OF CALIFORNIA, IRVINE
</organization>
</author>
<date year="2000"/>
</front>
</reference>
<t>The jsonpaths used in this document are provided according to the Goessner v. 0.8.0 proposal <xref target="GOESSNER-JSON-PATH"/>.</t> <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.R FC.6901.xml"/>
<t>Such specification requires that implementations support a set of &quot;basic <reference anchor="SEEK" target="https://www.eversql.com/faster-paginati
operators&quot;. These operators are used to access the elements of a JSON str on-in-mysql-why-order-by-with-limit-and-offset-is-slow/">
ucture like objects and arrays, and their subelements, respectively, object memb <front>
ers and array items. No operations are defined for retrieving parent or sibling <title>Faster Pagination in Mysql - Why Order By With Limit and Offs
elements of a given element. The root element is always referred to as $ regar et is Slow?</title>
dless of it being an object or array.</t> <author>
<organization>EverSQL</organization>
</author>
<date year="2017" month="July"/>
</front>
</reference>
<t>Additionally, the specification permits implementations to support arbitrary <reference anchor="W3C.CR-xpath-31-20170321" target="https://www.w3.org/
script expressions. These can be used to index into an object or array, or to f TR/2017/REC-xpath-31-20170321/">
ilter elements from an array. While script expression behavior is implementatio <front>
n-defined, most implementations support the basic relational and logical operato <title>XML Path Language (XPath) 3.1</title>
rs, as well as both object member and array item access, sufficiently similar fo <author initials="J." surname="Robie" fullname="Jonathan Robie">
r the purpose of this document. Commonly-supported operators/functions divided <organization/>
into &quot;top-level operators&quot; and &quot;filter operators&quot; are docume </author>
nted in <xref target="table_json_path_top_level_operators"/> and <xref target="t <author initials="M." surname="Dyck" fullname="Michael Dyck">
able_json_path_filter_operators"/> respectively.</t> <organization/>
</author>
<author initials="J." surname="Spiegel" fullname="Josh Spiegel">
<organization/>
</author>
<date month="March" year="2017"/>
</front>
<refcontent>World Wide Web Consortium Recommendation REC-xpath-31-2017
0321</refcontent>
</reference>
</references>
<t>For more information on implementation interoperability issues, see [JSONPATH -COMPARISON]. As at the time of writing, work is beginning on a standardization effort, too: see [JSONPATH-WG].</t> </references>
<texttable anchor="table_json_path_top_level_operators" title="JSONPath T <section anchor="jsonpath-operators">
op-Level Operators"> <name>JSONPath Operators</name>
<ttcol align="left">Operator</ttcol> <t>The jsonpaths used in this document are provided according to the Goess
<ttcol align="left">Description</ttcol> ner proposal <xref target="GOESSNER-JSON-PATH"/>.</t>
<c>$</c><c>Root element</c> <t>Such specification requires that implementations support a set of
<c>.&lt;name&gt;</c><c>Object member access (dot-notation)</c> "basic operators". These operators are used to access the elements of a
<c>['&lt;name&gt;']</c><c>Object member access (bracket-notation)</c> JSON structure like objects and arrays, as well as their subelements
<c>[&lt;number&gt;]</c><c>Array item access</c> (object members and array items, respectively). No operations are
<c>*</c><c>All elements within the specified scope</c> defined for retrieving parent or sibling elements of a given element.
<c>[?(&lt;expression&gt;)]</c><c>Filter expression</c> The root element is always referred to as $ regardless of it being an
</texttable> object or array.</t>
<t>Additionally, the specification permits implementations to support
arbitrary script expressions. These can be used to index into an object
or array, or to filter elements from an array. While script expression
behavior is implementation-defined, most implementations support the
basic relational and logical operators as well as both object member and
array item access, sufficiently similar for the purpose of this
document. Commonly supported operators/functions divided into
"top-level operators" and "filter operators" are documented in Tables <xre
f
target="table_json_path_top_level_operators" format="counter"/> and <xref
target="table_json_path_filter_operators" format="counter"/>, respectively
.</t>
<t>For more information on implementation interoperability issues, see
<xref target="JSONPATH-COMPARISON" format="default"/>. At the time
of writing, work is beginning on a standardization effort too (see
<xref target="JSONPATH-WG" format="default"/>).</t>
<table anchor="table_json_path_top_level_operators">
<name>JSONPath Top-Level Operators</name>
<thead>
<tr>
<th align="left">Operator</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">$</td>
<td align="left">Root element</td>
</tr>
<tr>
<td align="left">.&lt;name&gt;</td>
<td align="left">Object member access (dot-notation)</td>
</tr>
<tr>
<td align="left">['&lt;name&gt;']</td>
<td align="left">Object member access (bracket-notation)</td>
</tr>
<tr>
<td align="left">[&lt;number&gt;]</td>
<td align="left">Array item access</td>
</tr>
<tr>
<td align="left">*</td>
<td align="left">All elements within the specified scope</td>
</tr>
<tr>
<td align="left">[?(&lt;expression&gt;)]</td>
<td align="left">Filter expression</td>
</tr>
</tbody>
</table>
<table anchor="table_json_path_filter_operators">
<name>JSONPath Filter Operators</name>
<thead>
<tr>
<th align="left">Operator</th>
<th align="left">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">@</td>
<td align="left">Current element being processed</td>
</tr>
<tr>
<td align="left">.&lt;name&gt;</td>
<td align="left">Object member access</td>
</tr>
<tr>
<td align="left">.[&lt;name1&gt;,&lt;name2&gt;]</td>
<td align="left">Union of object members</td>
</tr>
<tr>
<td align="left">[&lt;number&gt;]</td>
<td align="left">Array item access</td>
</tr>
<tr>
<td align="left">==</td>
<td align="left">Left is equal to right</td>
</tr>
<tr>
<td align="left">!=</td>
<td align="left">Left is not equal to right</td>
</tr>
<tr>
<td align="left">&lt;</td>
<td align="left">Left is less than right</td>
</tr>
<tr>
<td align="left">&lt;=</td>
<td align="left">Left is less than or equal to right</td>
</tr>
<tr>
<td align="left">&gt;</td>
<td align="left">Left is greater than right</td>
</tr>
<tr>
<td align="left">&gt;=</td>
<td align="left">Left is greater than or equal to right</td>
</tr>
<tr>
<td align="left">&amp;&amp;</td>
<td align="left">Logical conjunction</td>
</tr>
<tr>
<td align="left">||</td>
<td align="left">Logical disjunction</td>
</tr>
</tbody>
</table>
</section>
<section anchor="approaches-to-result-pagination">
<texttable anchor="table_json_path_filter_operators" title="JSONPath Filt <name>Approaches to Result Pagination</name>
er Operators"> <t>An RDAP query could return a response with hundreds, even thousands, of
<ttcol align="left">Operator</ttcol> objects, especially when partial matching is used. For this reason, the "curso
<ttcol align="left">Description</ttcol> r" parameter addressing result pagination is defined to make responses easier to
<c>@</c><c>Current element being processed</c> handle.</t>
<c>.&lt;name&gt;</c><c>Object member access</c> <t>Presently, the most popular methods to implement pagination in a REST A
<c>.[&lt;name1&gt;,&lt;name2&gt;]</c><c>Union of object members</c> PI include offset pagination and keyset pagination. Neither pagination method r
<c>[&lt;number&gt;]</c><c>Array item access</c> equires the server to handle the result set in a storage area across multiple re
<c>==</c><c>Left is equal to right</c> quests since a new result set is generated each time a request is submitted. Th
<c>!=</c><c>Left is not equal to right</c> erefore, they are preferred to any other method requiring the management of a RE
<c>&lt;</c><c>Left is less than right</c> ST session.</t>
<c>&lt;=</c><c>Left is less than or equal to right</c> <t>Using limit and offset operators represents the traditionally used meth
<c>&gt;</c><c>Left is greater than right</c> od to implement result pagination. Both of them can be used individually:
<c>&gt;=</c><c>Left is greater than or equal to right</c> </t>
<c>&amp;&amp;</c><c>Logical conjunction</c> <dl>
<c>||</c><c>Logical disjunction</c>
</texttable>
</section> <dt>"limit=N":
</dt>
<dd>means that the server returns the first N objects of the result set
</dd>
<section anchor="approaches-to-result-pagination" title="Approaches to Result Pa <dt>"offset=N":
gination"> </dt>
<dd>means that the server skips the first N objects and returns objects starting
from position N+1
</dd>
<t>An RDAP query could return a response with hundreds, even thousands, o f objects, especially when partial matching is used. For this reason, the curso r parameter addressing result pagination is defined to make responses easier to handle.</t> </dl>
<t>Presently, the most popular methods to implement pagination in a REST API inc <t>When limit and offset are used together, they provide the ability to id
lude offset pagination and keyset pagination. Neither pagination method require entify a specific portion of the result set. For example, the pair "offset=100,
s the server to handle the result set in a storage area across multiple requests limit=50" returns the first 50 objects starting from position 101 of the result
since a new result set is generated each time a request is submitted. Therefor set.</t>
e, they are preferred to any other method requiring the management of a REST ses <t>Though easy to implement, offset pagination also includes drawbacks:
sion.</t> </t>
<ul>
<li>
<t>When offset has a very high value, scrolling the result set could t
ake some time.</t>
<t>Using limit and offset operators represents the traditionally used method </li>
to implement result pagination. Both of them can be used individually: <li>
<list style="symbols"> <t>It always requires fetching all rows before dropping as many rows a
<t>&quot;limit=N&quot;: means that the server returns the first N objec s specified by offset.</t>
ts of the result set;<vspace blankLines='1' /></t>
<t>&quot;offset=N&quot;: means that the server skips the first N object
s and returns objects starting from position N+1.</t>
</list></t>
<t>When limit and offset are used together, they provide the ability to identify </li>
a specific portion of the result set. For example, the pair &quot;offset=100,l <li>It may return inconsistent pages when data are frequently updated (i
imit=50&quot; returns the first 50 objects starting from position 101 of the res .e., real-time data).</li>
ult set.</t> </ul>
<t>Keyset pagination <xref target="SEEK"/> adds a query condition that ena
bles the selection of the only data not yet returned. This method has been take
n as the basis for the implementation of a "cursor" parameter <xref target="CURS
OR"/> by some REST API providers <xref target="CURSOR-API1"/> <xref target="CURS
OR-API2"/>. The cursor is a URL-safe string opaque to the client and representi
ng a logical pointer to the first result of the next page.</t>
<t>Though easy to implement, offset pagination also includes drawbacks: <t>Nevertheless, even keyset pagination can be troublesome:
<list style="symbols"> </t>
<t>when offset has a very high value, scrolling the result set could <ul>
take some time;<vspace blankLines='1' /></t> <li>
<t>it always requires fetching all rows before dropping as many rows <t>It needs at least one key field.</t>
as specified by offset;<vspace blankLines='1' /></t>
<t>it may return inconsistent pages when data are frequently updated (
i.e. real-time data).</t>
</list></t>
<t>Keyset pagination <xref target="SEEK"/> adds a query condition that enables t </li>
he selection of the only data not yet returned. This method has been taken as t <li>
he basis for the implementation of a &quot;cursor&quot; parameter <xref target=" <t>It does not allow sorting simply by any field because the sorting
CURSOR"/> by some REST API providers <xref target="CURSOR-API1"/> <xref target=" criterion must contain a key.</t>
CURSOR-API2"/>. The cursor is an opaque to client URL-safe string representing
a logical pointer to the first result of the next page.</t>
<t>Nevertheless, even keyset pagination can be troublesome: </li>
<list style="symbols"> <li>
<t>it needs at least one key field;<vspace blankLines='1' /></t>
<t>it does not allow sorting simply by any field because the sorting cr
iterion must contain a key;<vspace blankLines='1' /></t>
<t>it works best with full composite values support by data base mana
gement systems (i.e. [x,y]>[a,b]), emulation is possible but inelegant and less
efficient;<vspace blankLines='1' /></t>
<t>it does not allow direct navigation to arbitrary pages because the
result set must be scrolled in sequential order starting from the initial page;
<vspace blankLines='1' /></t>
<t>implementing bi-directional navigation is tedious because all comp
arison and sort operations have to be reversed.</t>
</list></t>
<section anchor="pagination-in-rdap" title="Specific Issues Raised by RDAP"> <t>It works best with full composite values supported by database
<t>Some additional considerations can be made in the RDAP context: management systems (i.e., [x,y]&gt;[a,b]); emulation is possible but
<list style="symbols"> inelegant and less efficient.</t>
<t>an RDAP object is a conceptual aggregation of information generall
y collected from more than one data structure (e.g. table) and this makes it eve
n harder to implement keyset pagination, a task that is already quite difficult.
For example, the entity object can include information from different data str
uctures (registrars, registrants, contacts, resellers), each one with its key fi
eld mapping the RDAP entity handle;<vspace blankLines='1' /></t>
<t>depending on the number of page results as well as the number and
the complexity of the properties of each RDAP object in the response, the time r
equired by offset pagination to skip the previous pages could be much faster tha
n the processing time needed to build the current page. In fact, RDAP objects a
re usually formed by information belonging to multiple data structures and conta
ining multivalued properties (i.e. arrays) and, therefore, data selection might
therefore be a time consuming process. This situation occurs even though the se
lection is supported by indexes;<vspace blankLines='1' /></t>
<t>depending on the access levels defined by each RDAP operator, the
increase in complexity and the decrease in flexibility of keyset pagination in c
omparison to offset pagination could be considered impractical.</t>
</list></t>
<t>Ultimately, both pagination methods have benefits and drawbacks.</t> </li>
<li>
<t>It does not allow direct navigation to arbitrary pages because
the result set must be scrolled in sequential order starting from
the initial page.</t>
</section> </li>
</section> <li>Implementing bidirectional navigation is tedious because all
comparison and sort operations have to be reversed.</li>
</ul>
<section anchor="pagination-in-rdap">
<name>Specific Issues Raised by RDAP</name>
<t>Some additional considerations can be made in the RDAP context:
</t>
<ul>
<li>
<t>An RDAP object is a conceptual aggregation of information
generally collected from more than one data structure (e.g.,
table), and this makes it even harder to implement keyset
pagination, a task that is already quite difficult. For example,
the entity object can include information from different data
structures (registrars, registrants, contacts, resellers), each
one with its key field mapping the RDAP entity handle.</t>
<section anchor="additional-implementation-notes" title="Additional Implem </li>
entation Notes"> <li>
<t>This section contains an overview of the main choices made during the <t>Depending on the number of page results as well as the number
implementation of the capabilities defined above in the RDAP public test server and the complexity of the properties of each RDAP object in the
of Registro.it at the Institute of Informatics and Telematics of the National R response, the time required by offset pagination to skip the
esearch Counci (IIT-CNR). The content of this section can represent a guidance previous pages could be much faster than the processing time
for those implementers who plan to provide RDAP users with those capabilities. needed to build the current page. In fact, RDAP objects are
The RDAP public test server can be accessed at https://rdap.pubtest.nic.it/. Fu usually formed by information belonging to multiple data
rther documentation about the server features is available at https://rdap.pubte structures and containing multivalued properties (i.e., arrays);
st.nic.it/doc/README.html.</t> therefore, data selection might be a time-consuming
process. This situation occurs even though the selection is
supported by indexes.</t>
<section title="Sorting"> </li>
<t>If no sort criterion is specified in the query string, the resu <li>Depending on the access levels defined by each RDAP operator,
lts are sorted by a default property: &quot;name&quot; for domains and nameserve the increase in complexity and the decrease in flexibility of keyset
rs, &quot;handle&quot; for entities. The server supports multiple property sort pagination in comparison to offset pagination could be considered
ing but the &quot;sorting_metadata&quot; object includes only the links to alter impractical.</li>
native result set views sorted by a single property just to show the list of sor </ul>
ting properties allowed for each searchable object. The server supports all the <t>Ultimately, both pagination methods have benefits and
object specific sorting properties described in the specification except for na drawbacks.</t>
meserver sorting based on unicodeName, that is, the &quot;name&quot; sorting pro </section>
perty is mapped onto the &quot;ldhName&quot; response field. Regarding the obje </section>
ct common properties, the sorting by registrationDate, expirationDate, lastChang <section anchor="additional-implementation-notes">
edDate and transferDate is supported.</t>
</section>
<section title="Counting"> <name>Implementation Notes</name>
<t>The counting operation is implemented through a separate query.
Some relational database management systems support custom operators to get th
e total count together with the rows, but the resulting query can be considerabl
y more expensive than that performed without the total count. Therefore, as &qu
ot;totalCount&quot; is an optional response information, fetching always the tot
al number of rows has been considered an inefficient solution. Furthermore, to
avoid the processing of unnecessary queries, when the &quot;count&quot; paramete
r is included in the submitted query, it is not also repeated in the query strin
gs of the &quot;links&quot; array provided in both &quot;paging_metadata&quot; a
nd &quot;sorting_metadata&quot; objects.</t>
</section>
<section title="Paging"> <t>This section contains an overview of the main choices made during the
<t>The server implements the cursor pagination through the keyset pagi implementation of the capabilities defined in this document in the RDAP pu
nation when sorting by a unique property is requested or the default sort is app blic test
lied, through offset pagination otherwise. As most of the relational database m server of Registro.it at the Institute of Informatics and Telematics of
anagement systems don't support the comparison of full composite values natively the National Research Council (IIT-CNR). The content of this section
, the implementation of full keyset pagination seem to be troublesome so, at lea can represent guidance for implementers who plan to provide RDAP
st initially, a selective applicability of keyset pagination is advisable. More users with those capabilities. The RDAP public test server can be
over, the &quot;cursor&quot; value encodes not only information about pagination accessed at <eref target="https://rdap.pubtest.nic.it/"
but also about the search pattern and the other query parameters in order to ch brackets="angle"/>. Further documentation about the server features is
eck the consistency of the entire query string. If the &quot;cursor&quot; value available at <eref target="https://rdap.pubtest.nic.it/doc/README.html"
is inconsistent with the rest of the query string, the server returns an error brackets="angle"/>.</t>
response.</t>
<section>
<name>Sorting</name>
<t>If no sort criterion is specified in the query string, the results ar
e sorted by a default property: "name" for domains and nameservers, and "handle"
for entities. The server supports multiple property sorting but the "sorting_m
etadata" object includes only the links to alternative result set views sorted b
y a single property just to show the list of sorting properties allowed for each
searchable object. The server supports all the object-specific sorting propert
ies described in the specification except for nameserver sorting based on unicod
eName, that is, the "name" sorting property is mapped onto the "ldhName" respons
e field. Regarding the object-common properties, sorting by registrationDate, e
xpirationDate, lastChangedDate, and transferDate is supported.</t>
</section> </section>
<section>
<name>Counting</name>
<t>The counting operation is implemented through a separate query. Some relational database management systems support custom operators to get the tota l count together with the rows, but the resulting query can be considerably more expensive than that performed without the total count. Therefore, as "totalCou nt" is an optional response information, always fetching the total number of row s has been considered an inefficient solution. Furthermore, to avoid the proces sing of unnecessary queries, when the "count" parameter is included in the submi tted query, it is not also repeated in the query strings of the "links" array pr ovided in both "paging_metadata" and "sorting_metadata" objects.</t>
</section> </section>
<section>
<name>Paging</name>
<section title="Acknowledgements" numbered="no"> <t>The server implements the cursor pagination through the keyset
<t>The authors would like to acknowledge Brian Mountford, Tom Harrison, Ka pagination when sorting by a unique property is requested or the
rl Heinz Wolf, Jasdip Singh, Erik Kline, Éric Vyncke, Benjamin Kaduk and Roman D default sort is applied. Otherwise, it implements the cursor
anyliw for their contribution to the development of this document.</t> pagination through the offset pagination. As most relational database
management systems don't support the comparison of full composite
values natively, the implementation of full keyset pagination seem to
be troublesome so, at least initially, a selective applicability of
keyset pagination is advisable. Moreover, the "cursor" value encodes
not only information about pagination but also about the search
pattern and the other query parameters in order to check the
consistency of the entire query string. If the "cursor" value is
inconsistent with the rest of the query string, the server returns an
error response.</t>
</section>
</section> </section>
<section numbered="false">
<section title="Change Log" numbered="no"> <name>Acknowledgements</name>
<t> <t>The authors would like to acknowledge <contact fullname="Brian Mountfor
<list style="hanging"> d"/>, <contact fullname="Tom Harrison"/>, <contact fullname="Karl Heinz Wolf"/>,
<t hangText="00:">Initial working group version ported from draft-loff <contact fullname="Jasdip Singh"/>, <contact fullname="Erik Kline"/>, <contact
redo-regext-rdap-sorting-and-paging-05</t> fullname="Éric Vyncke"/>, <contact fullname="Benjamin Kaduk"/>, and <contact ful
<t hangText="01:">Removed both &quot;offset&quot; and &quot;nextOffse lname="Roman Danyliw"/> for their contributions to the development of this docum
t&quot; to keep &quot;paging_metadata&quot; consistent between the pagination m ent.</t>
ethods. Renamed &quot;Considerations about Paging Implementation&quot; section
in &quot;&quot;cursor&quot; Parameter&quot;. Removed &quot;FOR DISCUSSION&quot;
items. Provided a more detailed description of both &quot;sorting_metadata&quo
t; and &quot;paging_metadata&quot; objects.</t>
<t hangText="02:">Removed both &quot;offset&quot; and &quot;limit&quo
t; parameters. Added ABNF syntax of the cursor parameter. Rearranged the layou
t of some sections. Removed some items from &quot;Informative References&quot;
section. Changed &quot;IANA Considerations&quot; section.</t>
<t hangText="03:">Added &quot;cc&quot; to the list of sorting propert
ies in &quot;Sorting Properties Declaration&quot; section. Added RFC8605 to the
list of &quot;Informative References&quot;.</t>
<t hangText="04:">Replaced &quot;ldhName&quot; with &quot;name&quot;
in the &quot;Sorting Properties Declaration&quot; section. Clarified the sortin
g logic for the JSON value types and the sorting policy for multivalued fields.<
/t>
<t hangText="05:">Clarified the logic of sorting on IP addresses. Cl
arified the mapping between the sorting properties and the RDAP response fields.
Updated &quot;Acknowledgements&quot; section.</t>
<t hangText="06:">Renamed &quot;pageCount&quot; to &quot;pageSize&quo
t; and added &quot;pageNumber&quot; in the &quot;paging_metadata&quot; object.</
t>
<t hangText="07:">Added &quot;Paging Responses to POST Requests&quot;
section.</t>
<t hangText="08:">Added &quot;Approaches to Result Pagination&quot; s
ection to appendix. Added the case of requesting a sort on a property not inclu
ded in the response to the errors listed in the &quot;Negative Answers&quot; sec
tion.</t>
<t hangText="09:">Updated the &quot;Implementation Status&quot; secti
on to include APNIC implementation. Moved the &quot;RDAP Conformance&quot; sect
ion up in the document. Removed the &quot;Paging Responses to POST Requests&quo
t; section. Updated the &quot;Acknowledgements&quot; section. Removed unused r
eferences. In the &quot;Sorting Properties Declaration&quot; section:
<list style="symbols">
<t>clarified the logic of sorting on events;</t>
<t>corrected the jsonpath of the &quot;lastChanged&quot; sorting proper
ty;</t>
<t>provided a JSONPath example taking into account the vCard &quot;pref
&quot; parameter.</t>
</list>
</t>
<t hangText="10:">Corrected the jsonpaths of both &quot;fn&quot; and
&quot;org&quot; sorting properties in Table 2. Corrected JSON content in <xref
target="sort-link-in-response-example"/>. Moved <xref target="W3C.CR-xpath-31-2
0161213"/> and <xref target="RFC7942"/> to the &quot;Normative References&quot;.
Changed the rdapConformance tags &quot;sorting_level_0&quot; and &quot;paging_
level_0&quot; to &quot;sorting&quot; and &quot;paging&quot; respectively.</t>
<t hangText="11:">Added the &quot;JSONPath operators&quot; sectio
n to appendix.</t>
<t hangText="12:">Changed the content of &quot;JSONPath operators
&quot; section.</t>
<t hangText="13:">Minor pre-AD review edits.</t>
<t hangText="14:">Additionl minor pre-AD review edits.</t>
<t hangText="15:">In section &quot;&quot;sort&quot; Parameter&quot; adde
d a paragraph providing conversions of IP addresses into their numerical represe
ntations. In section &quot;Sorting Properties Declaration&quot; rearranged Tabl
e 2 in a list to make the content more readable. Other minor edits due to AD re
view.</t>
<t hangText="16:">In section &quot;Introduction&quot; replaced &quot;..
. large result set that could be truncated ...&quot; with &quot;... large result
set that is often truncated ...&quot; as suggested by Gen-ART reviewer. Added
<xref target="additional-implementation-notes"/>.</t>
<t hangText="17:">Edits made:
<list style="symbols">
<t>in the &quot;Sorting and Paging Metadata&quot; section:
<list style="symbols">
<t>replaced &quot;Members are:&quot; with &quot;The AvailableSort obje
ct includes the following members:&quot;;</t>
<t>clarified that an RDAP server MUST define only one default sorting
property for each object class;</t>
</list>
</t>
<t>in the &quot;Negative Answers&quot; section:
<list style="symbols">
<t>replaced the phrase &quot;the response MAY include additional info
rmation regarding the negative answer&quot; with the phrase &quot;the response M
AY include additional information regarding either the supported sorting propert
ies or the correct cursor value&quot;;</t>
<t>added a new example;</t>
</list>
</t>
<t>clarified the required members of a Link object in the &quot;Represent
ing Sorting Links&quot; section;</t>
<t>corrected the [REST] reference in the &quot;Informative References&qu
ot; section;</t>
<t>replaced the phrase &quot;and subsequent denial of service due to abu
se&quot; with the phrase &quot;and subsequent denial of service&quot; in &quot;S
ecurity Considerations&quot; section.</t>
</list>
</t>
<t hangText="18:">Edits made:
<list style="symbols">
<t>in the &quot;Introduction&quot; section:
<list style="symbols">
<t>revised the reasons for using query parameters in
stead of HTTP headers;</t>
</list>
</t>
<t>in the &quot;Sorting and Paging Metadata&quot; section:
<list style="symbols">
<t>replaced the phrase &quot;number of objects retur
ned in the current page&quot; with the phrase &quot;number of objects that shoul
d have been returned in the current page&quot; in the definition of the &quot;pa
geSize&quot; field;</t>
</list>
</t>
<t>in the &quot;&quot;sort&quot; Parameter&quot; section:
<list style="symbols">
<t>clarified the sorting logic for values denoting d
ates and times;</t>
<t>replaced the IPv6 address &quot;2001:0db8:85a3:00
00:0000:8a2e:0370:7334&quot; with &quot;2001:0db8:85a3:0:0:8a2e:0370:7334&quot;;
</t>
</list>
</t>
<t>in the &quot;Sorting Properties Declaration&quot; section
:
<list style="symbols">
<t>replaced the sorting properties &quot;ipV4&quot;
and &quot;ipV6&quot; with &quot;ipv4&quot; and &quot;ipv6&quot;;</t>
<t>replaced the sentence &quot;Therefore, the assump
tion of having a single IPv4 and/or IPv6 value for a nameserver cannot be consid
ered too stringent.&quot; with the sentence &quot;Therefore, this specification
makes the assumption that nameservers have a single IPv4 and/or IPv6 value.&quot
;</t>
<t>clarified that the sorting properties MUST NOT be
used with a with a meaning other than the one described this document;</t>
<t>specified that JSONPath operators used in this se
ction are those defined in &quot;Appendix A&quot;;</t>
</list>
</t>
<t>in the &quot;&quot;cursor&quot; Parameter&quot; section:
<list style="symbols">
<t>corrected the Base64 encoding of &quot;offset=100
,limit=50&quot;;</t>
<t>clarified that RDAP servers are NOT RECOMMENDED t
o obfuscate a cursor value through a mere Base64 encoding;</t>
</list>
</t>
<t>changed last sentence of second paragraph of the &quot;Se
curity Considerations&quot; section;</t>
<t>updated the &quot;Acknowledgements&quot; section;</t>
<t>in &quot;Appendix A&quot;:
<list style="symbols">
<t>changed introductory paragraph;</t>
<t>replaced &quot;opaque URL-safe string&quot; with
&quot;opaque to client URL-safe string&quot;;</t>
</list>
</t>
<t>added JSONPath union operator in Table 2 of &quot;Appendi
x B&quot;</t>
<t>changed the explanation of offset and limit operators in
&quot;Appendix B&quot;;</t>
<t>converted the figures containing only RDAP queries into t
exts;</t>
<t>changed the wildcard prefixed patterns into wildcard suff
ixed in all the RDAP queries;</t>
<t>cleaned the text.</t>
</list>
</t>
<t hangText="19:">Replaced the words &quot;encryption/encrypt&quot;
with &quot;obfuscation/obfuscate&quot; in the &quot;&quot;cursor&quot; Parameter
&quot; section.</t>
<t hangText="20:">Added a final paragraph to <xref target="jsonpath-
operators"/> to reference the comparison between JSONPath operators and IETF JSO
NPath WG web site.</t>
</list>
</t>
</section> </section>
</back> </back>
</rfc> </rfc>
 End of changes. 153 change blocks. 
1113 lines changed or deleted 1348 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/