<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-gupta-httpapi-events-query-01" ipr="trust200902" sortRefs="true" submissionType="IETF" symRefs="true" tocInclude="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.2 -->
  <front>
    <title>HTTP Events Query</title>
    <seriesInfo name="Internet-Draft" value="draft-gupta-httpapi-events-query-01"/>
    <author fullname="Rahul Gupta">
      <organization/>
      <address>
        <email>cxres+ietf@protonmail.com</email>
      </address>
    </author>
    <date day="17" month="October" year="2025"/>
    <area>Web and Internet Transport</area>
    <workgroup>Building Blocks for HTTP APIs</workgroup>
    <keyword>event</keyword>
    <keyword>query</keyword>
    <keyword>notification</keyword>
    <abstract>
      <?line 93?>

<t>Events Query is a minimal protocol built on top of HTTP that allows user agents to receive <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> directly from any resource of interest. The Events Query Protocol (EQP) is predicated on the idea that the most intuitive source for <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> is the resource itself.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://CxRes.github.io/events-query/draft-gupta-httpapi-events-query.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gupta-httpapi-events-query/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Building Blocks for HTTP APIs Working Group mailing list (<eref target="mailto:httpapi@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/httpapi/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/httpapi/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/CxRes/events-query"/>.</t>
    </note>
  </front>
  <middle>
    <?line 98?>

<section anchor="introduction">
      <name>Introduction</name>
      <t anchor="intro-http-traditional-use">HTTP was originally designed as a stateless, request/response protocol for transferring hypermedia documents on the web (<xref section="1.2" sectionFormat="comma" target="HTTP"/>). This design was adequate for web pages that were mostly static and written by hand.</t>
      <t anchor="intro-real-time-needs">But web applications have evolved over time to provide increasingly dynamic and interactive experiences, requiring near-instantaneous updates. HTTP does not automatically inform clients of changes to a resource. Developers have employed various techniques, such as Comet <xref target="COMET"/> and Server-Sent Events <xref target="SSE"/> to work around this constraint, but these can be suboptimal for many applications.</t>
      <t anchor="intro-alternate-protocols">For this reason, web programmers often prefer implementing custom messaging systems over alternate protocols such as WebSocket <xref target="WS"/> and WebSub <xref target="WEBSUB"/>. Not only does this approach require additional layers of code, involving multiple Web APIs and/or userland libraries such as <eref target="https://socket.io/">socket.io</eref>, it demands extra coordination effort to synchronize representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> across multiple protocols. The dual-protocol approach thus compounds the development and maintenance overhead. Furthermore, deployment at scale is challenging with the <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> traffic now opaque to network intermediaries.</t>
      <t anchor="intro-events-query">Events Query is a minimal protocol built on top of the Hypertext Transfer Protocol <xref target="HTTP"/> that allows applications to request <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> directly from a resource of interest using the <tt>QUERY</tt> method (<xref section="3" sectionFormat="comma" target="HTTP-QUERY"/>).</t>
      <t anchor="intro-convenience">The objective of this specification is to make the request and receipt of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> extremely convenient for consumers. Events Query allows programmers to incorporate real-time functionality in their web applications without the need to switch to another protocol. Further, Events Query can deliver representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> from a resource in a single response, obviating any need for coordination and saving on unnecessary round trips.</t>
      <t anchor="intro-fetch-example" keepWithNext="true">With the help of a suitable composite media type parser, Events Query responses can be consumed with just a few lines of code, as illustrated in the JavaScript example below:</t>
      <figure anchor="events-query-fetch-example">
        <name>Events Query fetch example</name>
        <sourcecode name="events-query-fetch-example.js" type="javascript"><![CDATA[
const response = await fetch("http://example.com/foo", {
  method: "QUERY",
  headers: {
    Accept: "application/http",
    "Content-Type": "example/events-query"
  },
  body: JSON.stringify({
    state: { Accept: "text/plain" },
    events: { Accept: "example/event-notification" }
  })
});

// split the response into an iterable of representation and notifications
const splitResponse = splitHTTPResponseStream(response);

// read the representation
const {done, value: representation} = await splitResponse.next();
if (!done) {
  // do something with the representation
}

// iterate over notifications
for await (const notification of splitResponse) {
  // do something with a notification
}
]]></sourcecode>
      </figure>
      <t anchor="intro-conneg">Unlike other <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> mechanisms, Events Query supports content negotiation for <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>, just like representations. Thus, the Events Query Protocol preserves the flexibility of interaction afforded by HTTP and extends it to <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
      <t anchor="intro-sync">When combined with suitable data synchronization technologies like Conflict Free Replicated Data Types (CRDT) or Operational Transforms (OT), <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> can be used to create "live" representations. This can immensely simplify the task of programming multi-author distributed real-time applications.</t>
    </section>
    <section anchor="design">
      <name>Design</name>
      <t anchor="resource-as-source-of-truth">Events Query is predicated on a resource itself being the most intuitive source for <iref item="event"/><xref format="none" target="event">events</xref> on it. Events Query treats <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> as a response to a query for an <iref item="event"/><xref format="none" target="event">event</xref> occurring on the resource. With HTTP allowing representations to provide a potentially unbounded stream of data, the Events Query Protocol is also able to communicate multiple <iref item="event"/><xref format="none" target="event">events</xref> on the resource as a stream of <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
      <section anchor="goals">
        <name>Goals</name>
        <t anchor="goals-list">To aid the development of real-time applications, it is imperative that the Events Query Protocol reduces the complexity of both servers and clients implementing <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. With this in mind, the goals of the Events Query Protocol are:</t>
        <ol spacing="normal" type="1"><li anchor="goal--http-only">
            <t>to provide reliable and in-order transfer of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> using the Hypertext Transfer Protocol <xref target="HTTP"/>. Clients fetching resources over HTTP need not switch to another protocol for receiving <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
          </li>
          <li anchor="goal--unified-source-of-truth">
            <t>to send updates directly from a resource of interest, obviating the need for additional resources to be specifically dedicated as <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> endpoints. In contrast to existing approaches, this frees up the client from the burden of coordinating the response from the resource of interest with <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> from an endpoint.</t>
          </li>
          <li anchor="goal--unified-request">
            <t>to deliver the representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> in response to a single request, minimizing round trips between clients and servers. It also eliminates the need to synchronize the delivery of the representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
          </li>
          <li anchor="goal--content-negotiation">
            <t>to enable the transfer of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> using arbitrary formats that might be content-negotiated. This allows implementers to serve <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> that are more expressive, say, in comparison to existing HTTP-based messaging protocols such as Server-Sent Events <xref target="SSE"/>.</t>
          </li>
          <li anchor="goal--intermediation">
            <t>to specify transparent <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> semantics that empowers intermediaries to scale <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>, improve reliability and reduce latency. Intermediaries shall also be able to proactively update caches in real-time.</t>
          </li>
        </ol>
      </section>
      <section anchor="constraints">
        <name>Constraints</name>
        <t anchor="constraints-list">To the extent feasible, the Events Query:</t>
        <ol spacing="normal" type="1"><li anchor="constraint--reuse">
            <t>adheres to established practices and conventions. In particular, every attempt has been made to reuse existing protocols and specifications. Implementers shall be able to repurpose existing tools and libraries for implementing this specification.</t>
          </li>
          <li anchor="constraint--rest">
            <t>conforms to <xref format="title" target="REST"/>, best practices for <xref format="title" target="RFC9205"/> <xref target="RFC9205"/>, and <xref format="title" target="RFC6202"/> <xref target="RFC6202"/>. This specification can thus be used to extend the capabilities of any existing or future resource to additionally serve <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> over HTTP. This is to afford implementers the opportunity to scale <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> with their data and application.
<!--
  See my original comment on the solid/specification Gitter channel on 24 April 2020
  https://matrix.to/#/!PlIOdBsCTDRSCxsTGA:gitter.im/$VgCcuq2HbpLKJvxIw4witAUOsqcdhC98glgzqVI1WOY
-->
            </t>
          </li>
        </ol>
      </section>
      <section anchor="scope">
        <name>Scope</name>
        <t anchor="in-scope">The Events Query Protocol specifies:</t>
        <ol spacing="normal" type="1"><li anchor="scope--discovery">
            <t>A mechanism to discover support for Events Query on a resource (<xref target="discovery"/>).</t>
          </li>
          <li anchor="scope--request">
            <t>A mechanism to request <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> from a resource (Sections <xref format="counter" target="single-notification-request"/> and <xref format="counter" target="stream-request"/>) along with the representation (<xref target="representation-request"/>).</t>
          </li>
          <li anchor="scope--query-data-model">
            <t>An abstract <iref item="data model"/><xref format="none" target="data-model">data model</xref> for requesting <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> (<xref target="data-model"/>).</t>
          </li>
          <li anchor="scope--single-response-semantics">
            <t>Response semantics for a <xref target="single-notification-response">single notification</xref>.</t>
          </li>
          <li anchor="scope--streaming-response-semantics">
            <t>Response semantics for a stream carrying the <xref target="representation-response">representation</xref> (if requested) and <xref target="stream-response">multiple event notifications</xref>.</t>
          </li>
        </ol>
        <t anchor="out-of-scope">The Events Query Protocol does not specify:</t>
        <ol spacing="normal" type="1"><li anchor="no-scope--specific-data-model">
            <t>A realization of the abstract <iref item="data model"/><xref format="none" target="data-model">data model</xref> used for requesting <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
          </li>
          <li anchor="no-scope--specific-events">
            <t>The <iref item="event"/><xref format="none" target="event">events</xref> for which a <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> might be generated. This can be varied per resource.</t>
          </li>
          <li anchor="no-scope--notification-format">
            <t>The form or content of an <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref>. Implementations have the flexibility to generate <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> for the applications they wish to support on a resource.</t>
          </li>
          <li anchor="no-scope--stream-representation">
            <t>Specific representations for the response stream with multiple <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
          </li>
        </ol>
      </section>
      <section anchor="limitations">
        <name>Limitations</name>
        <t anchor="limitation--resource-specificity">Events Query only allows <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> to be sent for <iref item="event"/><xref format="none" target="event">events</xref> on a given resource. To transfer <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> originating from multiple resources in a single response, implementations will need to mint additional resources to serve as <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> endpoints. This is no different from APIs built on top of existing messaging protocols (See, for example, WebSocket <xref target="WS"/> and WebSub <xref target="WEBSUB"/>).</t>
        <t anchor="limitation--connection-limits">Browsers cap the number of persistent HTTP/1.1 connections per host, limiting the suitability of Events Query for web applications in the browser that require simultaneous <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> from multiple resources on the same host. This limitation is identical to that of other HTTP-based streaming protocols, such as Server-Sent Events <xref target="SSE"/>. Implementations are strongly encouraged to adopt HTTP/2 (or later). HTTP/1.1 servers might consider setting up a reverse proxy over HTTP/2 (or later) or implement mitigation strategies, such as, maximizing the number of concurrent connections and providing alternate hosts for resources. Implementations might alternatively consider using endpoints to provide <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> for multiple resources as previously described. Clients on a browser requesting <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> over an HTTP/1.1 connection are advised to exercise caution when simultaneously opening multiple persistent connections to a given host.</t>
      </section>
      <section anchor="comparison-with-server-sent-events">
        <name>Comparison with Server-Sent Events</name>
        <t>At the time of writing, Server-Sent Events (SSE) is the de facto mechanism for transferring <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> over HTTP, standardized through the EventSource API <xref target="SSE"/> as part of HTML Living Standard by the WHATWG.<cref anchor="EventSource_Obsolecense">As of October 2022, HTML Living Standard maintainer Anne van Kesteren has <eref target="https://github.com/whatwg/html/issues/8297#issuecomment-1291658863">stated</eref> that WHATWG does not intend to extend EventSource, with reasons for the decision cited in a subsequent <eref target="https://github.com/whatwg/html/issues/8297#issuecomment-1291658863">comment</eref>.</cref></t>
        <t>Server-Sent Events defines the <tt>text/event-stream</tt> media type to transmit <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> in response to a GET request. This approach is fundamentally inconsistent with terminology defined in HTTP Semantics (<xref section="3.2" sectionFormat="comma" target="HTTP"/>), transferring a sequence of asynchronous messages instead of a representation "that is intended to reflect a past, current, or desired state of a given resource". Practically, the <tt>text/event-stream</tt> media type being limited to only textual content forces developers to opt for alternative protocols such as WebSockets <xref target="WS"/>, despite the increased complexity. The EventSource API does not even allow for headers to be sent with requests. This has led to a proliferation of aftermarket hacks<cref anchor="hacks">such as <eref target="https://www.npmjs.com/package/event-source-plus">this</eref>, <eref target="https://www.npmjs.com/package/@microsoft/fetch-event-source">this</eref>, <eref target="https://www.npmjs.com/package/fetch-event-stream">this</eref>, <eref target="https://www.npmjs.com/package/extended-eventsource">this</eref>, <eref target="https://www.npmjs.com/package/ngx-sse-client">this</eref> and <eref target="https://www.npmjs.com/package/sse.js">this</eref></cref> that extend Server-Sent Events with support for custom headers, such as for credentials, or use the POST method to communicate additional configuration in the request body.</t>
        <t>Events Query takes a principled approach to <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>, as established in <xref target="terminology"/>. In particular, the definition of an <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> as a "representation" of <iref item="event"/><xref format="none" target="event">event</xref>(s) (<xref target="notification"/>) admits the use of arbitrary media types for <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. Clients can use content negotiation as well as preconditions in a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request. Further, Events Query not only lets clients receive both the representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> over the same protocol, viz. HTTP, but these can be encapsulated within a single HTTP response. Clients do not need to, say, authenticate multiple times, possibly with different mechanisms, to obtain data from the same resource or co-ordinate and synchronize multiple response streams carrying a representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
        <!-- Conformance Sections -->

</section>
    </section>
    <section anchor="conformance">
      <name>Conformance</name>
      <section anchor="document-conventions">
        <name>Document Conventions</name>
        <t>All examples and notes in this specification are non-normative.</t>
      </section>
      <section anchor="requirements-notation">
        <name>Requirements Notation</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<!-- Normative Sections -->

</section>
    </section>
    <section anchor="terminology">
      <name>Terminology and Core Concepts</name>
      <section anchor="event">
        <name>Event</name>
        <iref item="event" primary="true"/>
        <t anchor="event-defn">An event is the instantaneous effect of the (normal or abnormal) termination of the invocation of an operation on an object of interest <xref target="DESIGN-FRAMEWORK"/>. The entity invoking an operation is termed the <strong><iref item="invoker" primary="true"/>invoker</strong>.</t>
        <t anchor="events-in-HTTP">In the specific context of HTTP, the object of interest is data scoped to some resource. When the operation is an HTTP method, the <iref item="invoker"/>invoker is a user agent. However, an operation need not be limited to an HTTP method, it might just as easily have been invoked using another mechanism or protocol. Events are then an extension of resource state (See <xref section="3.2" sectionFormat="comma" target="HTTP"/>) in the temporal dimension.</t>
      </section>
      <section anchor="observation">
        <name>Observation</name>
        <iref item="observation" primary="true"/>
        <t anchor="observation-defn">An <iref item="event"/><xref format="none" target="event">event</xref> is considered observable, if an entity outside the <iref item="invoker"/>invoker and object of interest can detect its occurrence <xref target="DESIGN-FRAMEWORK"/>. This entity is the <strong><iref item="observer" primary="true"/>observer</strong>.</t>
        <t anchor="observer-in-HTTP">It follows from the HTTP uniform interface that the <iref item="observer"/>observer is always a server. The <iref item="event"/><xref format="none" target="event">events</xref> that are observed, the mechanism of observation, and information recorded from the <iref item="event"/><xref format="none" target="event">event</xref> are implementation details for the server.</t>
        <t anchor="observation-roles">That an origin server has to assume the role of an <iref item="observer"/>observer in order to generate <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> is obvious. An intermediary, while not observing the data scoped to a resource directly, still has the possibility to serve as an <iref item="observer"/>observer. An intermediary can observe <iref item="event"/><xref format="none" target="event">events</xref> transmitted by an origin server or another intermediary, whether using Events Query or another mechanism, to generate <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> for outbound consumers.</t>
      </section>
      <section anchor="notification">
        <name>Event Notification</name>
        <iref item="notification" primary="true"/><iref item="event notification" primary="true"/>
        <t anchor="notification-defn">An <iref item="notification"/>event notification, or <iref item="event notification"/>notification, is information transmitted by an <iref item="observer"/>observer upon an <iref item="event"/><xref format="none" target="event">event</xref> or contiguous <iref item="event"/><xref format="none" target="event">events</xref> on a resource.</t>
        <t anchor="notification-in-HTTP">Events Query extends "information hiding" behind the HTTP uniform interface to the temporal dimension by defining communication with respect to a transferable <iref item="event notification"/>notification of the resource <iref item="event"/><xref format="none" target="event">event</xref>(s), rather than transferring the <iref item="event"/><xref format="none" target="event">event</xref>(s) themselves.</t>
        <t anchor="notification-characteristics">A target resource might be capable of generating multiple <iref item="event notification"/>notifications for the same <iref item="event"/><xref format="none" target="event">event</xref>(s) that a <iref item="subscriber"/>subscriber can select from using content negotiation. Hypertext <iref item="event notification"/>notifications can not only provide information about the resource <iref item="event"/><xref format="none" target="event">events</xref> but also processing instructions that help guide the recipient's future actions, for example, the possibility to determine the current representation from a previous representation.</t>
      </section>
      <section anchor="subscription">
        <name>Subscription</name>
        <iref item="subscription" primary="true"/>
        <t anchor="subscription-defn">A subscription is an expression of interest to receive <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> sent to an <iref item="observer"/>observer. The requesting entity is a <strong><iref item="subscriber" primary="true"/>subscriber</strong>.</t>
        <t anchor="subscriber-in-HTTP">Due to the request/response semantics of HTTP, the <iref item="subscriber"/>subscriber coincides with the recipient of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> (<xref target="DESIGN-FRAMEWORK"/> uses the term <em>requester</em> or <em>broker</em> to identify a requesting entity, with the <em>broker</em> and <em>recipient</em> together forming the <iref item="subscriber"/>subscriber; for this specification, the distinction is not necessary).</t>
        <t anchor="subscription-conneg">The subscription in the form of a query affords the user agent the opportunity to engage in content negotiation for preferred form of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> (as well as the representation, if simultaneously requested).</t>
      </section>
    </section>
    <section anchor="events-field">
      <name><tt>Events</tt> Header Field</name>
      <iref item="events (header field)" primary="true"/>
      <t anchor="events-field-intro">"<tt>Events</tt>" is a Dictionary structured header field (<xref section="3.2" sectionFormat="comma" target="HTTP-SF"/>) to communicate the properties of a response stream to an Events Query.</t>
      <t anchor="events-field-request">In a request, the <tt>Events</tt> header field allows a client to indicate its preferences for the properties of the response stream carrying <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. The <tt>Events</tt> header field is not meant for content negotiation.</t>
      <t anchor="events-field-response">In a response, the <tt>Events</tt> header field allows a server to specify the properties of a response stream carrying <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
      <t anchor="events-field-stipulations">The order of keys in the <tt>Events</tt> header field is insignificant. Senders <bcp14>SHOULD NOT</bcp14> generate keys not registered with the HTTP <iref item="event"/><xref format="none" target="event">Event</xref> Field Registry (with the exception made to allow experimentation). Recipients <bcp14>MAY</bcp14> ignore keys that they are unaware of.</t>
      <section anchor="duration-property">
        <name><tt>duration</tt> Property</name>
        <iref item="duration (property)" primary="true"/>
        <t anchor="duration-property-intro">The "<tt>duration</tt>" property is an Integer (<xref section="3.3.1" sectionFormat="comma" target="HTTP-SF"/>) or Decimal (<xref section="3.3.2" sectionFormat="comma" target="HTTP-SF"/>) valued Dictionary key specified on the <tt>Events</tt> header field to communicate the response duration in seconds.</t>
        <t anchor="duration-property-request">In a request, the <tt>duration</tt> property indicates the duration for which a client wants to receive <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. A server <bcp14>MAY</bcp14> ignore this property.</t>
        <t anchor="duration-property-response">In a response, the <tt>duration</tt> property specifies the maximum duration for which a server intends to serve <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. This property is merely advisory, and a server <bcp14>MAY</bcp14> close the response stream before this duration.</t>
        <t anchor="duration-property-stipulations">Only positive values are valid. A value of <tt>0</tt> indicates an indefinite duration. A sender <bcp14>MUST</bcp14> conform to these stipulations when generating the <tt>duration</tt> property. If the value of the <tt>duration</tt> property fails to conform to these stipulations, it <bcp14>MUST</bcp14> be ignored by the recipient.</t>
      </section>
    </section>
    <section anchor="data-model">
      <name>Subscription Data Model</name>
      <iref item="data model" primary="true"/>
      <t anchor="data-model-description">The abstract data model specifies the semantics of an Events Query.</t>
      <t anchor="data-model-requirements">A realization of the data model allows a client to specify in a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request:</t>
      <ul spacing="normal">
        <li anchor="data-model-requirement-notifications">
          <t>an interest in receiving a stream of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> from a resource in a preferred form.</t>
        </li>
        <li anchor="data-model-requirement-representation">
          <t>an interest in receiving a representation of a resource in a preferred form.</t>
        </li>
      </ul>
      <t anchor="data-model-realization">Implementations can choose appropriate media types to realize the <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> data model. Implementations are free to extend the data model to include additional data. A specific realization of the data model is outside the scope of this specification.</t>
      <t anchor="data-model-example">The following example shows the body of a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request wherein the <tt>state</tt> and <tt>events</tt> properties are used to specify request headers for representation and <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> respectively in a YAML-like syntax.</t>
      <figure anchor="data-model-example-yaml">
        <name>Events Query Data Model in a YAML-like syntax</name>
        <sourcecode name="data-model-example.yaml" type="yaml"><![CDATA[
state:
  Accept: text/html
events:
  Accept: example/event-notification
]]></sourcecode>
      </figure>
    </section>
    <section anchor="discovery">
      <name>Discovery</name>
      <t anchor="discovery-requirement">A user agent can discover if a server enables Events Query on a resource by examining support for query with a media type that can realize the <xref format="title" target="data-model"/>. A server <bcp14>MUST</bcp14> advertise media types accepted for Events Query using the <tt>Accept-Query</tt> header field (<xref section="3" sectionFormat="comma" target="HTTP-QUERY"/>) in a response.</t>
      <figure anchor="discovery-request-example">
        <name>Discovery Request</name>
        <sourcecode name="discovery-request-example.http" type="http-message"><![CDATA[
HEAD /foo HTTP/1.1
Host: example.org

]]></sourcecode>
      </figure>
      <figure anchor="discovery-response-example">
        <name>Discovery Response</name>
        <sourcecode name="discovery-response-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:00:00 GMT
Accept: text/html
Accept-Query: "example/events-query"
]]></sourcecode>
      </figure>
      <aside anchor="no-events-long-lived-resources">
        <t><strong>Implementation Advice</strong></t>
        <t>Servers are advised against enabling <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> on long-lived resources over HTTP. A resource might be considered long-lived, if a server determines a low probability of an <iref item="event"/><xref format="none" target="event">event</xref> on the resource in the duration of the response. In such instances, servers are strongly advised to respond with the <tt>Cache-Control</tt> (<xref section="5" sectionFormat="comma" target="HTTP-CACHING"/>) header field and the <tt>max-age</tt> parameter (<xref section="5.2.2.1" sectionFormat="comma" target="HTTP-CACHING"/>) set in it.</t>
      </aside>
    </section>
    <section anchor="single-notification">
      <name>Single Notification</name>
      <t anchor="single-notification-description">The simplest Events Query is to request a <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> for the next <iref item="event"/><xref format="none" target="event">event</xref>(s) on a resource. This, in effect, adds long polling capability (<xref section="2" sectionFormat="comma" target="RFC6202"/>) to a resource.</t>
      <section anchor="single-notification-request">
        <name>Request</name>
        <t anchor="single-notification-procedure">To receive a single <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref>, a client makes a <tt>QUERY</tt> request (<xref section="3" sectionFormat="comma" target="HTTP-QUERY"/>) using a realization of the <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> <iref item="data model"/><xref format="none" target="data-model">data model</xref> that <bcp14>MUST NOT</bcp14> include an interest in receiving a stream of <iref item="event"/><xref format="none" target="event">event</xref> <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
        <t anchor="single-notification-request-conneg">Since the content of the response is an <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref>, a client can negotiate its form with header fields in the usual manner.</t>
        <figure anchor="single-notification-request-example">
          <name>Single Event Notification Request</name>
          <sourcecode name="single-notification-request-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: example/event-notification
Content-Type: example/events-query
Events: duration=0

‑‑‑
]]></sourcecode>
        </figure>
      </section>
      <section anchor="single-notification-response">
        <name>Response</name>
        <t anchor="single-notification-response-close">When a single <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> is requested, the server <bcp14>MUST</bcp14> close the connection immediately after sending the <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref>.</t>
        <figure anchor="single-notification-response-example">
          <name>Single Event Notification Response</name>
          <sourcecode name="single-notification-response-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:10:10 GMT
Accept-Query: example/events-query
Content-Type: example/event-notification
Incremental: ?1

published: 2025-01-02T10:11:12.345Z
event-id: 456
type: update
]]></sourcecode>
        </figure>
        <t>​</t>
        <aside anchor="no-hogging">
          <t><strong>Implementation Advice</strong></t>
          <t>When a user navigates away from a website or an application using Events Query, user agents are strongly encouraged to properly close the response and release the connection.</t>
        </aside>
      </section>
    </section>
    <section anchor="stream">
      <name>Notifications Stream</name>
      <t anchor="stream-description">Events Query can also be used to request a stream of multiple <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> (<xref section="3" sectionFormat="comma" target="RFC6202"/>).</t>
      <section anchor="stream-request">
        <name>Request</name>
        <t anchor="stream-request-procedure">To receive multiple <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>, a client makes a QUERY request (<xref section="3" sectionFormat="comma" target="HTTP-QUERY"/>) using a realization of the <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> <iref item="data model"/><xref format="none" target="data-model">data model</xref> that <bcp14>MUST</bcp14> include an interest in receiving a stream of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> in a preferred form.</t>
        <t anchor="stream-request-conneg">Since the response transmits <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> within an encapsulating representation (<xref target="stream-response"/>), it follows that header fields cannot be used to negotiate the form of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> as in the case of <xref target="single-notification-request">Single Notification Request</xref>. Instead, header fields are useful for negotiating the representation that encapsulates <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. The following examples illustrate <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> requests that negotiate a stream of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> to be transferred respectively using a composite media type (<tt>application/http</tt>) and a discrete media type (<tt>application/json-seq</tt>):</t>
        <t anchor="stream-request-http">The first example shows a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request for effectively a stream of discrete <xref target="single-notification">Single Notifications</xref> to be transferred using <tt>application/http</tt> (<xref section="10.2" sectionFormat="comma" target="RFC9112"/>) as the encapsulating media type. The <tt>events</tt> property in this example indicates an interest in receiving <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> and its sub-properties describe the preferred form of <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>. Since the <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> are transferred as a pipeline of HTTP messages, these sub-properties are identical to <xref target="single-notification-request-conneg">header fields</xref> used for specifying preconditions and content negotiation in a <xref target="single-notification-request">Single Notification Request</xref>.</t>
        <figure anchor="stream-request-http-example">
          <name>Request for HTTP Notifications Stream</name>
          <sourcecode name="stream-request-http-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: application/http
Content-Type: example/events-query
Events: duration=0

events:
  Accept: example/event-notification
]]></sourcecode>
        </figure>
        <t anchor="stream-request-json">The second example shows a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request for a stream of JSON <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> to be transferred using <tt>application/json-seq</tt> (<xref target="RFC7464"/>) as the encapsulating media type. The <tt>events</tt> property in this example is being used to communicate the preferred schema for the requested <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
        <figure anchor="stream-request-json-example">
          <name>Request for JSON Notifications Stream</name>
          <sourcecode name="stream-request-json-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: application/json-seq
Content-Type: example/events-query
Events: duration=0

events:
  @context: activity+json
]]></sourcecode>
        </figure>
      </section>
      <section anchor="stream-response">
        <name>Response</name>
        <t anchor="stream-response-encapsulation">The response stream transmits multiple <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> in an encapsulating media type. The following illustrates <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> streamed in both a composite media type (<tt>application/http</tt>) and a discrete media type (<tt>application/json-seq</tt>) in response to the example <xref target="stream-request">requests</xref> in <xref target="stream-request"/>.</t>
        <section anchor="stream-response-headers">
          <name>Headers</name>
          <t anchor="stream-response-headers-list">A server able to provide a stream of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> <bcp14>MUST</bcp14> immediately send headers, which include:</t>
          <ul spacing="normal">
            <li anchor="stream-response-events-field">
              <t>The <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> header field, to communicate the properties of the <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> stream.  </t>
              <ul spacing="normal">
                <li anchor="stream-response-duration-property">
                  <t>The <iref item="duration (property)"/><xref format="none" target="duration-property"><tt>duration</tt></xref> property, set to the maximum duration for which the server intends to serve <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
                </li>
              </ul>
            </li>
            <li anchor="stream-response-incremental-field">
              <t>The <tt>Incremental</tt> header field (<xref section="3" sectionFormat="comma" target="INCREMENTAL-HTTP-MESSAGES"/>) set to <tt>?1</tt> to indicate that the response is to be immediately forwarded by intermediaries and not buffered.</t>
            </li>
          </ul>
          <figure anchor="stream-response-headers-example">
            <name>Notifications Stream Response Headers</name>
            <sourcecode name="stream-response-headers-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:10:10 GMT
Accept-Query: example/events-query
Events: duration=600
Incremental: ?1
Transfer-Encoding: chunked

]]></sourcecode>
          </figure>
          <aside>
            <t>Since the <tt>Content-Type</tt> header field varies in response to the requests in <xref target="stream-request-http-example"/> and <xref target="stream-request-json-example"/>, it has been omitted here.</t>
          </aside>
        </section>
        <section anchor="stream-response-body">
          <name>Notifications</name>
          <t anchor="stream-response-event">Subsequently, when <iref item="event"/><xref format="none" target="event">event</xref>(s) occur, the server transmits a <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref>.</t>
          <t anchor="stream-update-event-http">An <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> transferred in an <tt>application/http</tt> response stream is identical to the <xref target="single-notification-response">Single Notification Response</xref>, except fields which are redundant with the response headers (<xref target="stream-response-headers"/>) are omitted.</t>
          <figure anchor="stream-update-notification-http-example">
            <name>HTTP Update Notification</name>
            <sourcecode name="stream-update-notification-http-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK                                  | Notification
Content-Length: 31                               |
Content-Type: example/event-notification         |
                                                 |
published: 2025-01-02T10:11:12.345Z              |
event-id: 456                                    |
type: update                                     |
]]></sourcecode>
          </figure>
          <t anchor="stream-update-event-json">The same <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> when transferred in an <tt>application/json-seq</tt> response stream is as follows:</t>
          <figure anchor="stream-update-notification-json-example">
            <name>JSON Update Notification</name>
            <artwork name="stream-update-notification-json-example.http"><![CDATA[
␞{                                              | Notification
  "published": "2025-01-02T10:11:12.345Z",       |
  "event-id": 456,                               |
  "type": "Update"                               |
}                                                |
]]></artwork>
          </figure>
          <t anchor="stream-response-terminal-event">A server <bcp14>MUST</bcp14> end the response immediately after transmitting the <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> that signals the deletion of a resource.</t>
          <t anchor="stream-delete-event-http">The <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> for a delete <iref item="event"/><xref format="none" target="event">event</xref> expressed as an HTTP message might be as follows:</t>
          <figure anchor="stream-delete-event-http-example">
            <name>HTTP Delete Notification</name>
            <sourcecode name="stream-delete-notification-http-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK                                  | Notification
Content-Length: 31                               |
Content-Type: example/event-notification         |
                                                 |
published: 2025-01-02T11:12:13.456Z              |
event-id: 789                                    |
type: delete                                     |
]]></sourcecode>
          </figure>
          <t anchor="stream-delete-event-json">The same <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notification</xref> for a delete <iref item="event"/><xref format="none" target="event">event</xref> in JSON would be as follows:</t>
          <figure anchor="stream-delete-event-json-example">
            <name>JSON Delete Notification</name>
            <artwork name="stream-delete-notification-json-example.http"><![CDATA[
␞{                                              | Notification
  "published": "2025-01-02T11:12:13.456Z",       |
  "event-id": 789,                               |
  "type": "delete"                               |
}                                                |
]]></artwork>
          </figure>
          <t anchor="stream-response-timeout">Otherwise, a server <bcp14>MUST</bcp14> end the response when the connection duration exceeds the period set in the <iref item="duration (property)"/><xref format="none" target="duration-property"><tt>duration</tt></xref> property of the <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> header field.</t>
        </section>
      </section>
    </section>
    <section anchor="representation">
      <name>Representation</name>
      <t anchor="representation-description">Events Query enables a user agent to ask and receive the current representation and subsequent <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> in a single request/response. When compared to using, say, Fetch <xref target="FETCH"/> and EventSource <xref target="SSE"/> in conjunction, Events Query not only saves on an extra round trip, but relieves a user agent from the burden of synchronizing the representation with <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>.</t>
      <section anchor="representation-request">
        <name>Request</name>
        <t anchor="representation-request-procedure">To receive a representation of the resource alongside <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>, a client makes a QUERY request (<xref section="3" sectionFormat="comma" target="HTTP-QUERY"/>) using a realization of the <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> <iref item="data model"/><xref format="none" target="data-model">data model</xref> that <bcp14>MUST</bcp14> also include an interest in receiving the representation in a preferred form.</t>
        <t anchor="representation-request-example-description">The following example shows a <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> request for the current representation along with the subsequent <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> transmitted using the <tt>application/http</tt> media type. The <tt>state</tt> property indicates interest in receiving representation and its sub-properties describe the preferred form of <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>. Since the representation is being transferred in an HTTP message pipeline, these sub-properties are identical to header fields used for specifying preconditions and content negotiation in a GET request on the said resource.</t>
        <figure anchor="representation-request-http-example">
          <name>HTTP Representation and Notifications Request</name>
          <sourcecode name="representation-request-http-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: application/http
Content-Type: example/events-query

state:
  Accept: text/html
events:
  Accept: example/event-notification
]]></sourcecode>
        </figure>
      </section>
      <section anchor="representation-response">
        <name>Response</name>
        <t anchor="representation-not-available">A server unable to provide a representation <bcp14>MUST NOT</bcp14> serve <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>. This does not apply to a conditional request for representation that is not fulfilled.</t>
        <t anchor="representation-response-body">A server able to provide a stream with a representation and <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> transmits the representation immediately following the response headers (<xref target="stream-response-headers"/>). Otherwise, the response is the same as that described in <xref target="stream-response"/>.</t>
        <t anchor="representation-response-encapsulation">Again, the <tt>application/http</tt> media type (<xref section="10.2" sectionFormat="comma" target="RFC9112"/>) is used for the purpose of illustration. Chunks have been omitted for clarity.</t>
        <figure anchor="representation-response-before-notifications-http-example">
          <name>Representation Response before Notifications</name>
          <sourcecode name="representation-response-before-notifications-http-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:10:10 GMT
Accept-Query: example/events-query
Events: duration=600
Incremental: ?1
Transfer-Encoding: chunked

HTTP/1.1 200 OK                                  | Representation
Content-Length: 14                               |
Content-Type: text/plain                         |
                                                 |
Hello World!                                     |
]]></sourcecode>
        </figure>
        <t anchor="representation-response-non-standard">While this is default behaviour, there is no requirement that a representation is the first message or that representations are sent only once. In such cases, the encapsulated message needs to indicate if it is a representation and not an <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref>. Such a mechanism is not defined in this specification.</t>
        <t anchor="representation-response-notifications"><iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">Notifications</xref> are transmitted just as in the case of <xref target="stream-response">regular streaming</xref>. See <xref target="example-representation"/> for a complete example of a response with representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>.</t>
        <!-- Considerations Sections -->

</section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t>A toy server built in Express.js demonstrating the Events Query Protocol is available at <eref target="https://github.com/CxRes/events-query-express-demo"/>. This demo is powered by the following libraries:</t>
      <ul spacing="normal">
        <li>
          <t><eref target="https://github.com/CxRes/negotiate-events-field">Negotiate Events Field</eref>: To read the request <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> header field (<xref target="events-field"/>) and negotiate the response <iref item="duration (property)"/><xref format="none" target="duration-property"><tt>duration</tt></xref> (<xref target="duration-property"/>),</t>
        </li>
        <li>
          <t><eref target="https://github.com/CxRes/nose">NOSE</eref>: To <iref item="observation"/>observe <iref item="event"/><xref format="none" target="event">events</xref> on resources and generate <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> in a preferred format, and</t>
        </li>
        <li>
          <t><eref target="https://github.com/CxRes/extended-response">Extended Response</eref>: To write the representation and <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> on the response stream for a given <iref item="duration (property)"/><xref format="none" target="duration-property"><tt>duration</tt></xref> (<xref target="duration-property"/>).</t>
        </li>
      </ul>
      <t>The demonstration and libraries are Free and Open Source Software, released under the Mozilla Public License, v. 2.0. Please contact the author for more information about these programs.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t anchor="derived-security-considerations">Events Query is subject to the security considerations of the HTTP <tt>QUERY</tt> method (<xref section="2" sectionFormat="comma" target="HTTP-QUERY"/>) and more generally HTTP Semantics. Considerations relevant to the use of HTTP <tt>QUERY</tt> method are discussed in <xref section="4" sectionFormat="of" target="HTTP-QUERY"/>. HTTP Semantics and its use for transferring information over the Internet are discussed in <xref section="17" sectionFormat="of" target="HTTP"/>.</t>
      <t anchor="security-considerations-ddos">When serving <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>, servers are required to keep the response stream open for an extended period of time. Since the effort required to request <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> is tiny compared to the time, memory, and bandwidth consumed attempting to serve the <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>, servers implementing Events Query have increased susceptibility to Denial-of-Service attacks. Servers ought to ignore, coalesce, or reject egregious <iref item="subscription"/><xref format="none" target="subscription">subscription</xref> requests, such as repeated requests from the same origin within a short interval of time.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t anchor="change-controller">The change controller for the following registrations is: "IETF (iesg@ietf.org) - Internet Engineering Task Force".</t>
      <section anchor="field-registration">
        <name>HTTP Field Registration</name>
        <t anchor="field-registration-instruction">IANA is requested to add the following entry in the "<eref target="https://www.iana.org/assignments/http-fields/">Hypertext Transfer Protocol (HTTP) Field Name Registry</eref>" (See <xref section="16.1.1" sectionFormat="of" target="HTTP"/>):</t>
        <table anchor="field-registration-list">
          <name>List of HTTP Field Name registrations</name>
          <thead>
            <tr>
              <th align="left">Header Field Names</th>
              <th align="left">Status</th>
              <th align="left">Structured-Type</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref></td>
              <td align="left">Permanent</td>
              <td align="left">Dictionary</td>
              <td align="left">
                <xref target="events-field"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="events-field-registry">
        <name>The HTTP Events Field Registry</name>
        <t anchor="registry-registration-instruction">IANA is requested to create a new registry, "HTTP Events Field Registry", under the <eref target="https://www.iana.org/assignments/http-parameters/">Hypertext Transfer Protocol (HTTP) Parameters</eref> registry to register properties for use in the <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> header field. New registrations will use the Specification Required policy (<xref section="4.6" sectionFormat="comma" target="RFC8126"/>).</t>
        <section anchor="events-field-registry-template">
          <name>Template</name>
          <t anchor="events-field-registry-template-required-list">The registration of an <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> property <bcp14>MUST</bcp14> include the following fields:</t>
          <ul spacing="normal">
            <li anchor="events-field-registry-template--property-name">
              <t>Property Name: A Dictionary (<xref section="3.2" sectionFormat="comma" target="HTTP-SF"/>) key to be used in the <iref item="events (header field)"/><xref format="none" target="events-field"><tt>Events</tt></xref> header field.</t>
            </li>
            <li anchor="events-field-registry-template--structured-type">
              <t>Structured Type: The Structured Data Type (<xref section="3.3" sectionFormat="comma" target="HTTP-SF"/>) of the value associated with the key, according to requirements in <xref section="3.2" sectionFormat="of" target="HTTP-SF"/>.</t>
            </li>
            <li anchor="events-field-registry-template--reference">
              <t>Reference: A pointer to the specification text.</t>
            </li>
          </ul>
          <t anchor="events-field-registry-template-optional-list">The registration <bcp14>MAY</bcp14> also include the following fields:</t>
          <ul spacing="normal">
            <li anchor="events-field-registry-template--optional-parameters">
              <t>Optional Parameters: An enumeration of optional parameters and the Structured Data Type (<xref section="3.3" sectionFormat="of" target="HTTP-SF"/>) of value associated with the parameter, according to requirements in <xref section="3.1.2" sectionFormat="of" target="HTTP-SF"/></t>
            </li>
            <li anchor="events-field-registry-template--comments">
              <t>Comments: Additional information to be included in the template.</t>
            </li>
          </ul>
        </section>
        <section anchor="events-field-registry-initial-content">
          <name>Initial Registry Contents</name>
          <t anchor="events-field-registry-initial-content-instruction">The initial contents of the HTTP Events Field Registry are:</t>
          <table anchor="events-property-registration-list">
            <name>List of HTTP Events Field property name registrations</name>
            <thead>
              <tr>
                <th align="left">Property Name</th>
                <th align="left">Structured-Type</th>
                <th align="left">Reference</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">
                  <iref item="duration (property)"/><xref format="none" target="duration-property"><tt>duration</tt></xref></td>
                <td align="left">Integer or Decimal Item</td>
                <td align="left">
                  <xref target="duration-property"/></td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
    </section>
    <section anchor="end-user-considerations">
      <name>End User Considerations</name>
      <t><cref anchor="End_User">If we, the IETF, claim that the Internet is for the end user <xref target="RFC8890"/> and promote the end-to-end principle <xref target="RFC3724"/>, every specification we produce ought to consider its impact on the Internet end user. For this reason, I propose that specifications must include a considerations section where authors assess the impact of their proposal on the Internet end user, aligned with the mission of IETF <xref target="RFC3935"/>.</cref></t>
      <t>End users of the HTTP protocol can be classified into two groups: publishers and consumers. Consumers have an incentive to subscribe to <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> from many resources and to hold on to a connection for as long as possible. Whereas publishers bear the cost of server infrastructure. Consumers also typically outnumber publishers, in many cases by multiple orders of magnitude. This creates an imbalance in the effort to subscribe versus effort to deliver; consumers can easily place a disproportionate burden on servers, reminiscent of a denial-of-service attack.</t>
      <t>At the outset, requiring that clients subscribe to <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> per resource serves as an effective filtering mechanism that limits the burden on servers. Compare this to the typical implementation of protocols such as WebSockets <xref target="WS"/>, where clients connect to dedicated endpoints to receive <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref>; the server either has to broadcast <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> for multiple resources or track resources of interest for each client to filter <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> accordingly.</t>
      <t>Events Query empowers servers to decide the content and the duration for which <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> are served on any given resource, as well as allowing servers to close the response stream at any time. Servers may also limit <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> and/or their content, except for authenticated consumers. Such authenticated consumers might, for example, be asked to share the cost burden with publishers in return for a higher quality of service.</t>
      <t>The use of HTTP Semantics also enables intermediation of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref>, unlike existing mechanisms built with protocols such as WebSockets <xref target="WS"/> or WebSub <xref target="WEBSUB"/>. Intermediaries can help with improving the latency and reliability of transmission of <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notifications</xref> as well as scaling of the <iref item="notification"/><iref item="event notification"/><xref format="none" target="notification">event notification</xref> traffic to reach a significantly larger base of consumers. On the flip side, economies of scale will likely lead to greater consolidation of intermediary service providers (though not centralization) with the attendant risk of anti-consumer behaviour. In the opinion of the authors, policies designed to treat network traffic as a public utility might provide better outcomes for the end user.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9112" to="HTTP/1.1"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-SF">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="HTTP-QUERY">
          <front>
            <title>The HTTP QUERY Method</title>
            <author fullname="Julian Reschke" initials="J." surname="Reschke">
              <organization>greenbytes GmbH</organization>
            </author>
            <author fullname="James M. Snell" initials="J. M." surname="Snell">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Mike Bishop" initials="M." surname="Bishop">
              <organization>Akamai</organization>
            </author>
            <date day="29" month="September" year="2025"/>
            <abstract>
              <t>   This specification defines the QUERY method for HTTP.  A QUERY
   requests that the request target process the enclosed content in a
   safe/idempotent manner and then respond with the result of that
   processing.  This is similar to POST requests but can be
   automatically repeated or restarted without concern for partial state
   changes.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-safe-method-w-body-12"/>
        </reference>
        <reference anchor="INCREMENTAL-HTTP-MESSAGES">
          <front>
            <title>Incremental HTTP Messages</title>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple</organization>
            </author>
            <author fullname="Martin Thomson" initials="M." surname="Thomson">
              <organization>Mozilla</organization>
            </author>
            <date day="29" month="April" year="2025"/>
            <abstract>
              <t>   This document specifies the "Incremental" HTTP header field, which
   instructs HTTP intermediaries to forward the HTTP message
   incrementally.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-httpbis-incremental-00"/>
        </reference>
        <reference anchor="RFC8126">
          <front>
            <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
            <author fullname="M. Cotton" initials="M." surname="Cotton"/>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <date month="June" year="2017"/>
            <abstract>
              <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
              <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
              <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="26"/>
          <seriesInfo name="RFC" value="8126"/>
          <seriesInfo name="DOI" value="10.17487/RFC8126"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="COMET" target="https://infrequently.org/2006/03/comet-low-latency-data-for-the-browser/">
          <front>
            <title>Comet: Low Latency Data for the Browser</title>
            <author fullname="Alex Russell" initials="A." surname="Russell">
              <organization/>
            </author>
            <date month="March" year="2006"/>
          </front>
          <refcontent>Infrequently Noted</refcontent>
        </reference>
        <reference anchor="DESIGN-FRAMEWORK">
          <front>
            <title>A design framework for Internet-scale event observation and notification</title>
            <author fullname="David S. Rosenblum" initials="D." surname="Rosenblum">
              <organization>Dept. of Info. &amp;amp; Computer Science, University of California, Irvine, Irvine, CA</organization>
            </author>
            <author fullname="Alexander L. Wolf" initials="A." surname="Wolf">
              <organization>Dept. of Computer Science, University of Colorado, Boulder, CO</organization>
            </author>
            <date month="November" year="1997"/>
          </front>
          <seriesInfo name="ACM SIGSOFT Software Engineering Notes" value="vol. 22, no. 6, pp. 344-360"/>
          <seriesInfo name="DOI" value="10.1145/267896.267920"/>
          <refcontent>Association for Computing Machinery (ACM)</refcontent>
        </reference>
        <reference anchor="FETCH" target="https://fetch.spec.whatwg.org">
          <front>
            <title>Fetch</title>
            <author fullname="Anne van Kesteren" initials="A." surname="van Kesteren">
              <organization/>
            </author>
            <date month="May" year="2025"/>
          </front>
          <seriesInfo name="WHATWG" value="Living Standard"/>
        </reference>
        <reference anchor="HTTP-CACHING">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="REST" target="https://roy.gbiv.com/pubs/dissertation/rest_arch_style.htm">
          <front>
            <title>Representational State Transfer (REST)</title>
            <author fullname="Roy Thomas Fielding" initials="R." surname="Fielding">
              <organization>University of California, Irvine</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Doctoral Dissertation" value="University of California, Irvine"/>
          <format target="https://roy.gbiv.com/pubs/dissertation/fielding_dissertation.pdf#G16.1026811" type="PDF"/>
          <refcontent>Chapter 5, Architectural Styles and the Design of Network-based Software Architectures</refcontent>
        </reference>
        <reference anchor="RFC3724">
          <front>
            <title>The Rise of the Middle and the Future of End-to-End: Reflections on the Evolution of the Internet Architecture</title>
            <author fullname="J. Kempf" initials="J." role="editor" surname="Kempf"/>
            <author fullname="R. Austein" initials="R." role="editor" surname="Austein"/>
            <author>
              <organization abbrev="IAB">Internet Architecture Board</organization>
            </author>
            <date month="March" year="2004"/>
            <abstract>
              <t>The end-to-end principle is the core architectural guideline of the Internet. In this document, we briefly examine the development of the end-to-end principle as it has been applied to the Internet architecture over the years. We discuss current trends in the evolution of the Internet architecture in relation to the end-to-end principle, and try to draw some conclusion about the evolution of the end-to-end principle, and thus for the Internet architecture which it supports, in light of these current trends. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3724"/>
          <seriesInfo name="DOI" value="10.17487/RFC3724"/>
        </reference>
        <reference anchor="RFC3935">
          <front>
            <title>A Mission Statement for the IETF</title>
            <author fullname="H. Alvestrand" initials="H." surname="Alvestrand"/>
            <date month="October" year="2004"/>
            <abstract>
              <t>This memo gives a mission statement for the IETF, tries to define the terms used in the statement sufficiently to make the mission statement understandable and useful, argues why the IETF needs a mission statement, and tries to capture some of the debate that led to this point. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="95"/>
          <seriesInfo name="RFC" value="3935"/>
          <seriesInfo name="DOI" value="10.17487/RFC3935"/>
        </reference>
        <reference anchor="RFC6202">
          <front>
            <title>Known Issues and Best Practices for the Use of Long Polling and Streaming in Bidirectional HTTP</title>
            <author fullname="S. Loreto" initials="S." surname="Loreto"/>
            <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
            <author fullname="S. Salsano" initials="S." surname="Salsano"/>
            <author fullname="G. Wilkins" initials="G." surname="Wilkins"/>
            <date month="April" year="2011"/>
            <abstract>
              <t>On today's Internet, the Hypertext Transfer Protocol (HTTP) is often used (some would say abused) to enable asynchronous, "server- initiated" communication from a server to a client as well as communication from a client to a server. This document describes known issues and best practices related to such "bidirectional HTTP" applications, focusing on the two most common mechanisms: HTTP long polling and HTTP streaming. This document is not an Internet Standards Track specification; it is published for informational purposes.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6202"/>
          <seriesInfo name="DOI" value="10.17487/RFC6202"/>
        </reference>
        <reference anchor="RFC7464">
          <front>
            <title>JavaScript Object Notation (JSON) Text Sequences</title>
            <author fullname="N. Williams" initials="N." surname="Williams"/>
            <date month="February" year="2015"/>
            <abstract>
              <t>This document describes the JavaScript Object Notation (JSON) text sequence format and associated media type "application/json-seq". A JSON text sequence consists of any number of JSON texts, all encoded in UTF-8, each prefixed by an ASCII Record Separator (0x1E), and each ending with an ASCII Line Feed character (0x0A).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7464"/>
          <seriesInfo name="DOI" value="10.17487/RFC7464"/>
        </reference>
        <reference anchor="RFC7838">
          <front>
            <title>HTTP Alternative Services</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <author fullname="J. Reschke" initials="J." surname="Reschke"/>
            <date month="April" year="2016"/>
            <abstract>
              <t>This document specifies "Alternative Services" for HTTP, which allow an origin's resources to be authoritatively available at a separate network location, possibly accessed with a different protocol configuration.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7838"/>
          <seriesInfo name="DOI" value="10.17487/RFC7838"/>
        </reference>
        <reference anchor="RFC8890">
          <front>
            <title>The Internet is for End Users</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="August" year="2020"/>
            <abstract>
              <t>This document explains why the IAB believes that, when there is a conflict between the interests of end users of the Internet and other parties, IETF decisions should favor end users. It also explores how the IETF can more effectively achieve this.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8890"/>
          <seriesInfo name="DOI" value="10.17487/RFC8890"/>
        </reference>
        <reference anchor="RFC9112">
          <front>
            <title>HTTP/1.1</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document specifies the HTTP/1.1 message syntax, message parsing, connection management, and related security concerns.</t>
              <t>This document obsoletes portions of RFC 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="99"/>
          <seriesInfo name="RFC" value="9112"/>
          <seriesInfo name="DOI" value="10.17487/RFC9112"/>
        </reference>
        <reference anchor="RFC9205">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <reference anchor="SSE" target="https://www.w3.org/TR/eventsource/">
          <front>
            <title>Server-Sent Events</title>
            <author/>
          </front>
          <seriesInfo name="W3C REC" value="eventsource"/>
          <seriesInfo name="W3C" value="eventsource"/>
        </reference>
        <reference anchor="WEBSUB" target="https://www.w3.org/TR/websub/">
          <front>
            <title>WebSub</title>
            <author/>
          </front>
          <seriesInfo name="W3C REC" value="websub"/>
          <seriesInfo name="W3C" value="websub"/>
        </reference>
        <reference anchor="WS" target="https://www.w3.org/TR/websockets/">
          <front>
            <title>The WebSocket API</title>
            <author/>
          </front>
          <seriesInfo name="W3C NOTE" value="websockets"/>
          <seriesInfo name="W3C" value="websockets"/>
        </reference>
      </references>
    </references>
    <?line 782?>

<section anchor="examples">
      <name>Examples</name>
      <t>Some examples used in this specification are consolidated below. Chunks have been omitted for clarity.</t>
      <section anchor="example-representation">
        <name>Representation and Notifications</name>
        <t anchor="example-description">The following example illustrates a complete request and response for representation and <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> transferred with the <tt>application/http</tt> media-type as described in <xref target="representation"/>: <xref format="title" target="representation"/>.</t>
        <section anchor="example-representation-request-http">
          <name>Request</name>
          <figure anchor="representation-request-http-complete-example">
            <name>Request for Representation and Notifications</name>
            <sourcecode name="representation-request-http-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: application/http
Content-Type: example/events-query

state:
  Accept: text/html
events:
  Accept: example/event-notification
]]></sourcecode>
          </figure>
        </section>
        <section anchor="example-http-representation-response">
          <name>Response</name>
          <figure anchor="representation-response-http-complete-example">
            <name>Response with Representation and Notifications</name>
            <sourcecode name="representation-response-http-complete-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:10:10 GMT
Accept-Query: example/events-query
Events: duration=600
Incremental: ?1
Transfer-Encoding: chunked
Content-Type: application/http

HTTP/1.1 200 OK                                  | Representation
Content-Length: 14                               |
Content-Type: text/plain                         |
                                                 |
Hello World!                                     |

HTTP/1.1 200 OK                                  | Notification
Content-Length: 31                               |
Content-Type: example/event-notification         |
                                                 |
published: 2025-01-02T10:11:12.345Z              |
event-id: 456                                    |
type: update                                     |

HTTP/1.1 200 OK                                  | Notification
Content-Length: 31                               |
Content-Type: example/event-notification         |
                                                 |
published: 2025-01-02T11:12:13.456Z              |
event-id: 789                                    |
type: delete                                     |
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="example-stream">
        <name>Notifications Stream</name>
        <t>This following example illustrates complete request and response for JSON formatted <iref item="event notification"/><iref item="notification"/><xref format="none" target="notification">notifications</xref> transferred with the <tt>application/json-seq</tt> media-type as described in <xref format="title" target="stream"/>: <xref format="title" target="stream"/>.</t>
        <section anchor="example-json-stream-request">
          <name>Request</name>
          <figure anchor="stream-request-json-complete-example">
            <name>Request for JSON Notifications</name>
            <sourcecode name="stream-request-example.http" type="http-message"><![CDATA[
QUERY /foo HTTP/1.1
Host: example.org
Accept: application/json-seq
Content-Type: example/events-query
Events: duration=0

events:
  @context: activity+json
]]></sourcecode>
          </figure>
        </section>
        <section anchor="example-json-stream-response">
          <name>Response</name>
          <figure anchor="stream-response-json-complete-example">
            <name>Response with JSON Notifications</name>
            <sourcecode name="stream-response-json-complete-example.http" type="http-message"><![CDATA[
HTTP/1.1 200 OK
Date: Thu, 02 Jan 2025 10:10:10 GMT
Accept-Query: example/events-query
Events: duration=600
Incremental: ?1
Transfer-Encoding: chunked
Content-Type: application/json-seq

␞{                                              | Notification
  "published": "2025-01-02T10:11:12.345Z",       |
  "event-id": 456,                               |
  "type": "Update"                               |
}                                                |
␞{                                              | Notification
  "published": "2025-01-02T11:12:13.456Z",       |
  "event-id": 789,                               |
  "type": "delete"                               |
}                                                |
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>We thank members of the HTTP Working Group, the HTTPAPI Working Group, the Solid community, the Braid community and others for discussions, ideas, reviews, and feedback on previous work that has led to this specification.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
TcMAAA==

-->

</rfc>
