<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pardue-httpbis-qlog-h2-events-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title>HTTP/2 qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-pardue-httpbis-qlog-h2-events-00"/>
    <author fullname="Lucas Pardue">
      <organization/>
      <address>
        <email>lucas@lucaspardue.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>HTTP</workgroup>
    <keyword>obsolete</keyword>
    <keyword>and</keyword>
    <keyword>sucks</keyword>
    <abstract>
      <?line 45?>

<t>This document defines a qlog event schema containing concrete events for the
core HTTP/2 protocol and selected extensions.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://LPardue.github.io/draft-pardue-httpbis-qlog-h2-events/draft-pardue-httpbis-qlog-h2-events.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-pardue-httpbis-qlog-h2-events/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        HTTP Working Group mailing list (<eref target="mailto:ietf-http-wg@w3.org"/>),
        which is archived at <eref target="https://lists.w3.org/Archives/Public/ietf-http-wg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/LPardue/draft-pardue-httpbis-qlog-h2-events"/>.</t>
    </note>
  </front>
  <middle>
    <?line 51?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document defines a qlog event schema (<xref section="8" sectionFormat="of" target="QLOG-MAIN"/>)
containing concrete events for the core HTTP/2 protocol <xref target="RFC9113"/> and selected
extensions (<xref target="ALTSVC"/>, <xref target="ORIGIN"/>,
<xref target="EXTENDED-CONNECT"/> and <xref target="EXTENSIBLE_PRIORITIZATION"/>).</t>
      <t>The event namespace with identifier <tt>http2</tt> is defined; see <xref target="schema-def"/>. In
this namespace multiple events derive from the qlog abstract Event class
(<xref section="7" sectionFormat="of" target="QLOG-MAIN"/>), each extending the "data" field and defining their
"name" field values and semantics.</t>
      <t><xref target="events-table"/> summarizes the name value of each event type that is defined in
this specification. Some event data fields use complex data types. These are
represented as enums or re-usable definitions, which are grouped together on the
bottom of this document for clarity.</t>
      <table anchor="events-table">
        <name>HTTP/2 Events</name>
        <thead>
          <tr>
            <th align="left">Name value</th>
            <th align="left">Importance</th>
            <th align="left">Definition</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">http2:parameters_set</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="parametersset"/></td>
          </tr>
          <tr>
            <td align="left">http2:parameters_restored</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="parametersrestored"/></td>
          </tr>
          <tr>
            <td align="left">http2:frame_created</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="framecreated"/></td>
          </tr>
          <tr>
            <td align="left">http2:frame_parsed</td>
            <td align="left">Core</td>
            <td align="left">
              <xref target="frameparsed"/></td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The event and data structure definitions in ths document are expressed in the
Concise Data Definition Language <xref target="CDDL"/> and its extensions described
in <xref target="QLOG-MAIN"/>.</t>
      <t>The following fields from <xref target="QLOG-MAIN"/> are imported and used: name, namespace,
type, data, group_id, RawInfo, and time-related fields.</t>
      <t>Events are defined with an importance level as described in <xref section="8.3" sectionFormat="of" target="QLOG-MAIN"/>.</t>
      <t>As is the case for <xref target="QLOG-MAIN"/>, the qlog schema definitions in this document
are intentionally agnostic to serialization formats. The choice of format is an
implementation decision.</t>
    </section>
    <section anchor="schema-def">
      <name>Event Schema Definition</name>
      <t>This document describes how HTTP/2 is expressed in qlog with an event schema.
Per the requirements in <xref section="8" sectionFormat="of" target="QLOG-MAIN"/>, this document registers the
<tt>http2</tt> namespace. The event schema URI is <tt>urn:ietf:params:qlog:events:http2</tt>.</t>
      <section removeInRFC="true" anchor="draft-event-schema-identification">
        <name>Draft Event Schema Identification</name>
        <t>Only implementations of the final, published RFC can use the events belonging to
the event schema with the URI <tt>urn:ietf:params:qlog:events:http2</tt>. Until such an
RFC exists, implementations <bcp14>MUST NOT</bcp14> identify themselves using this URI.</t>
        <t>Implementations of draft versions of the event schema <bcp14>MUST</bcp14> append the string
"-" and the corresponding draft number to the URI. For example, draft 99 of this
document is identified using the URI <tt>urn:ietf:params:qlog:events:http2-99</tt>.</t>
        <t>The namespace identifier itself is not affected by this requirement.</t>
      </section>
    </section>
    <section anchor="http2-events">
      <name>HTTP/2 Events</name>
      <t>HTTP/2 events extend the <tt>$ProtocolEventData</tt> extension point defined in
<xref target="QLOG-MAIN"/>. Additionally, they allow for direct extensibility by their use of
per-event extension points via the <tt>$$</tt> CDDL "group socket" syntax, as also
described in <xref target="QLOG-MAIN"/>.</t>
      <figure anchor="events-def">
        <name>HTTP2EventData definition and ProtocolEventData extension</name>
        <sourcecode type="cddl"><![CDATA[
HTTP2EventData = HTTP2ParametersSet /
                 HTTP2ParametersRestored /
                 HTTP2FrameCreated /
                 HTTP2FrameParsed

$ProtocolEventData /= HTTP2EventData
]]></sourcecode>
      </figure>
      <section anchor="parametersset">
        <name>parameters_set</name>
        <t>The <tt>parameters_set</tt> event contains HTTP/2 settings, mostly those received from
the SETTINGS frame. It has Core importance level.</t>
        <t>Parameters are typically set once but they can be set at different times during
the connection, therefore a qlog can have multiple instances of <tt>parameters_set</tt>
with different fields set.</t>
        <t>The "initiator" field reflects how Settings are exchanged on a connection. Sent
settings have the value "local" and received settings have the value
"received".</t>
        <figure anchor="parametersset-def">
          <name>HTTP2ParametersSet definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTP2ParametersSet = {
    ? initiator: Initiator

    ? header_table_size: uint32
    ? enable_push: uint32
    ? max_concurrent_streams: uint32
    ? initial_window_size: uint32
    ? max_frame_size: uint32
    ? max_header_list_size: uint32

    ? extended_connect: uint32
    ? no_rfc7540_priorities: uint32

    * $$http2-parametersset-extension
}
]]></sourcecode>
        </figure>
        <t>The <tt>parameters_set</tt> event can contain any number of unspecified fields. This
allows for representation of reserved settings (aka GREASE) or ad-hoc support
for extension settings that do not have a related qlog schema definition.</t>
      </section>
      <section anchor="parametersrestored">
        <name>parameters_restored</name>
        <t>When using TLS 0-RTT, HTTP/2 clients are expected to remember and reuse the
server's SETTINGs from the previous connection. The <tt>parameters_restored</tt> event
is used to indicate which HTTP/2 settings were restored and to which values when
utilizing 0-RTT. It has Core importance level.</t>
        <figure anchor="parametersrestored-def">
          <name>HTTP2ParametersRestored definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTP2ParametersRestored = {
    ? initiator: Initiator

    ? header_table_size: uint32
    ? enable_push: uint32
    ? max_concurrent_streams: uint32
    ? initial_window_size: uint32
    ? max_frame_size: uint32
    ? max_header_list_size: uint32

    ? extended_connect: uint32
    ? no_rfc7540_priorities: uint32

    * $$http2-parametersrestored-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="framecreated">
        <name>frame_created</name>
        <t>The <tt>frame_created</tt> event is emitted when the HTTP/2 framing actually happens.
It has Core importance level.</t>
        <figure anchor="framecreated-def">
          <name>HTTP2FrameCreated definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTP2FrameCreated = {
    stream_id: uint32
    frame: $HTTP2Frame

    * $$http2-framecreated-extension
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="frameparsed">
        <name>frame_parsed</name>
        <t>The <tt>frame_parsed</tt> event is emitted when the HTTP/2 frame is parsed. It has Core
importance level.</t>
        <figure anchor="frameparsed-def">
          <name>HTTP2FrameParsed definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTP2FrameParsed = {
    stream_id: uint32
    frame: $HTTP2Frame

    * $$http2-frameparsed-extension
}
]]></sourcecode>
        </figure>
      </section>
    </section>
    <section anchor="http2-data-type-definitions">
      <name>HTTP/2 Data Type Definitions</name>
      <t>The following data type definitions can be used in HTTP/2 events.</t>
      <section anchor="initiator">
        <name>Initiator</name>
        <figure anchor="initiator-def">
          <name>Initiator definition</name>
          <sourcecode type="cddl"><![CDATA[
Initiator = "local" /
            "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="http2frame">
        <name>HTTP2Frame</name>
        <t>The generic <tt>$HTTP2Frame</tt> is defined here as a CDDL "type socket" extension point.
It can be extended to support additional HTTP/2 frame types.</t>
        <figure anchor="frame-def">
          <name>HTTP2Frame type socket definition</name>
          <artwork><![CDATA[
; The HTTP2Frame is any key-value map (e.g., JSON object)
$HTTP2Frame /= {
    * text => any
}
]]></artwork>
        </figure>
        <t>The HTTP/2 frame types defined in this document are as follows:</t>
        <figure anchor="frames-def">
          <name>HTTP2Frames definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTP2BaseFrames = HTTP2DataFrame /
                  HTTP2HeadersFrame /
                  HTTP2PriorityFrame /
                  HTTP2RstStreamFrame /
                  HTTP2SettingsFrame /
                  HTTP2PushPromiseFrame /
                  HTTP2PingFrame /
                  HTTP2GoawayFrame /
                  HTTP2WindowUpdateFrame /
                  HTTP2ContinuationFrame /
                  HTTP2UnknownFrame

HTTP2ExtensionFrames = HTTP2AltSvcFrame /
                       HTTP2OriginFrame /
                       HTTP2PriorityUpdateFrame

$HTTP2Frame /= HTTP2BaseFrames / HTTP2ExtensionFrames
]]></sourcecode>
        </figure>
        <section anchor="http2dataframe">
          <name>HTTP2DataFrame</name>
          <figure anchor="dataframe-def">
            <name>HTTP2DataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2DataFrame = {
    frame_type: "data"

    ? padded: bool .default false
    ? end_stream: bool .default false

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2headersframe">
          <name>HTTP2HeadersFrame</name>
          <t>The payload of an HTTP/2 HEADERS frame is the HPACK-encoding of an HTTP field
section; see <xref target="RFC7541"/>. <tt>HTTP2HeadersFrame</tt>, in contrast, contains the HTTP
field section without encoding.</t>
          <figure anchor="h2field-def">
            <name>HTTP2HTTPField definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2HTTPField = {
    ? name: text
    ? name_bytes: hexstring
    ? value: text
    ? value_bytes: hexstring
}
]]></sourcecode>
          </figure>
          <figure anchor="headersframe-def">
            <name>HTTP2HeadersFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2HeadersFrame = {
    frame_type: "headers"
    ? priority: bool .default false
    ? padded: bool .default false
    ? end_headers: bool .default false
    ? end_stream: bool .default false

    headers: [* HTTP2HTTPField]
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
          <t>For example, the HTTP field section</t>
          <artwork><![CDATA[
:path: /index.html
:method: GET
:authority: example.org
:scheme: https
]]></artwork>
          <t>would be represented in a JSON serialization as:</t>
          <figure anchor="headersframe-ex">
            <name>HTTP2HeadersFrame example</name>
            <artwork><![CDATA[
headers: [
  {
    "name": ":path",
    "value": "/"
  },
  {
    "name": ":method",
    "value": "GET"
  },
  {
    "name": ":authority",
    "value": "example.org"
  },
  {
    "name": ":scheme",
    "value": "https"
  }
]
]]></artwork>
          </figure>
          <t><xref target="RFC9113"/> and <xref section="5.1" sectionFormat="of" target="RFC9110"/> define rules for the
characters used in HTTP field sections names and values. Characters outside the
range are invalid and result in the message being treated as malformed. It can
however be useful to also log these invalid HTTP fields. Characters in the
allowed range can be safely logged by the text type used in the <tt>name</tt> and
<tt>value</tt> fields of <tt>HTTP2HTTPField</tt>. Characters outside the range are unsafe for the
text type and need to be logged using the <tt>name_bytes</tt> and <tt>value_bytes</tt> field.
An instance of <tt>HTTP2HTTPField</tt> <bcp14>MUST</bcp14> include either the <tt>name</tt> or <tt>name_bytes</tt>
field and <bcp14>MAY</bcp14> include both. An <tt>HTTP2HTTPField</tt> <bcp14>MAY</bcp14> include a <tt>value</tt> or
<tt>value_bytes</tt> field or neither.</t>
        </section>
        <section anchor="http2priorityframe">
          <name>HTTP2PriorityFrame</name>
          <figure anchor="priorityframe-def">
            <name>HTTP2PriorityFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2PriorityFrame = {
    frame_type: "priority"

    exclusive: bool .default false
    stream_dependency: uint32
    weight: uint8
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2rststreamframe">
          <name>HTTP2RstStreamFrame</name>
          <figure anchor="rststreamframe-def">
            <name>HTTPRstStreamFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2RstStreamFrame = {
    frame_type: "rst_stream"

    error_code: uint32

    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2settingsframe">
          <name>HTTP2SettingsFrame</name>
          <t>The settings field can contain zero or more entries. Each setting has a name
field, which corresponds to Setting Name as defined (or as would be defined if
registered) in the "HTTP/3 Settings" registry maintained at
<eref target="https://www.iana.org/assignments/HTTP2-parameters">https://www.iana.org/assignments/HTTP2-parameters</eref>.</t>
          <t>An endpoint that receives unknown settings is not able to log a specific name.
Instead, the name value of "unknown" can be used and the value captured in the
<tt>name_bytes</tt> field; a numerical value without variable-length integer encoding.</t>
          <figure anchor="settingsframe-def">
            <name>HTTP2SettingsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2SettingsFrame = {
    frame_type: "settings"

    ? ack: bool .default false

    settings: [* HTTP2Setting]
    ? raw: RawInfo
}

HTTP2Setting = {
    ? name: $HTTP2SettingsName
    ; only when name === "unknown"
    ? name_bytes: uint32

    value: uint32
}

$HTTP2SettingsName /= "settings_header_table_size" /
                      "settings_enable_push" /
                      "settings_max_concurrent_streams" /
                      "settings_initial_window_size" /
                      "settings_max_frame_size" /
                      "settings_max_header_list_size" /
                      "settings_extended_connect" /
                      "settings_no_rfc7540_priorities" /
                      "unknown"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2pushpromiseframe">
          <name>HTTP2PushPromiseFrame</name>
          <figure anchor="pushpromiseframe-def">
            <name>HTTP2PushPromiseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2PushPromiseFrame = {
    frame_type: "push_promise"

    ? padded: bool .default false
    ? end_headers: bool .default false

    promised_stream_id: uint32
    headers: [* HTTP2HTTPField]
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2pingframe">
          <name>HTTP2PingFrame</name>
          <figure anchor="pingframe-def">
            <name>HTTP2PingFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2PingFrame = {
    frame_type: "ping"

    ? ack: bool .default false

    opaque_data: hexstring
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2goawayframe">
          <name>HTTP2GoAwayFrame</name>
          <figure anchor="goawayframe-def">
            <name>HTTP2GoawayFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2GoawayFrame = {
    frame_type: "goaway"

    last_stream_id: uint32
    error_code: uint32
    ? additional_debug_data: hexstring
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2windowupdateframe">
          <name>HTTP2WindowUpdateFrame</name>
          <figure anchor="windowupdateframe-def">
            <name>HTTP2WindowUpdateFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2WindowUpdateFrame = {
    frame_type: "window_update"

    window_size_increment: uint32
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2continuationframe">
          <name>HTTP2ContinuationFrame</name>
          <figure anchor="continuationframe-def">
            <name>HTTP2ContinuationFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2ContinuationFrame = {
    frame_type: "continuation"

    ? end_headers: bool .default false

    headers: [* HTTP2HTTPField]
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2unknownframe">
          <name>HTTP2UnknownFrame</name>
          <t>The frame_type_bytes field is the numerical value without variable-length
integer encoding.</t>
          <figure anchor="unknownframe-def">
            <name>HTTP2UnknownFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2UnknownFrame = {
    frame_type: "unknown"
    frame_type_bytes: uint32
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2altsvcframe">
          <name>HTTP2AltSvcFrame</name>
          <t>The ALTSVC frame is defined in <xref target="ALTSVC"/>.</t>
          <figure anchor="altsvcframe-def">
            <name>HTTP2AltSvcFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2AltSvcFrame = {
  frame_type: "altsvc"

  origin_len: uint16
  ? origin: text
  ? alt-svc-field-value: text
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2originframe">
          <name>HTTP2OriginFrame</name>
          <t>The ORIGIN frame is defined in <xref target="ORIGIN"/>.</t>
          <figure anchor="originframe-def">
            <name>HTTP2OriginFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2OriginEntry = {
  origin_len: uint16
  ? ASCII-Origin: text
}

HTTP2OriginFrame = {
  frame_type: "origin"

  origin_entries: [* HTTP2OriginEntry]
  ? raw: RawInfo
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="http2priorityupdateframe">
          <name>HTTP2PriorityUpdateFrame</name>
          <t>The PRIORITY_UPDATE frame is defined in <xref target="EXTENSIBLE_PRIORITIZATION"/>.</t>
          <figure anchor="priorityupdateframe-def">
            <name>HTTP2PriorityUpdateFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTP2PriorityUpdateFrame = {
  frame_type: "priority_update"

  prioritized_stream_id: uint32
  priority_field_value: HTTP2Priority
  ? raw: RawInfo
}

; The priority value in ASCII text, encoded using Structured Fields
; Example: u=5, i
HTTP2Priority = text
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security and privacy considerations discussed in <xref section="14" sectionFormat="of" target="QLOG-MAIN"/>
apply to this document as well.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document will have IANA actions if adopted.</t>
    </section>
  </middle>
  <back>
    <displayreference target="RFC9110" to="HTTP"/>
    <displayreference target="RFC9113" to="HTTP/2"/>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>qlog: Structured Logging for Network Protocols</title>
            <author fullname="Robin Marx" initials="R." surname="Marx">
              <organization>Akamai</organization>
            </author>
            <author fullname="Luca Niccolini" initials="L." surname="Niccolini">
              <organization>Meta</organization>
            </author>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Lucas Pardue" initials="L." surname="Pardue">
              <organization>Cloudflare</organization>
            </author>
            <date day="20" month="October" year="2025"/>
            <abstract>
              <t>   qlog provides extensible structured logging for network protocols,
   allowing for easy sharing of data that benefits common debug and
   analysis methods and tooling.  This document describes key concepts
   of qlog: formats, files, traces, events, and extension points.  This
   definition includes the high-level log file schemas, and generic
   event schemas.  Requirements and guidelines for creating protocol-
   specific event schemas are also presented.  All schemas are defined
   independent of serialization format, allowing logs to be represented
   in various ways such as JSON, CSV, or protobuf.

Note to Readers

      Note to RFC editor: Please remove this section before publication.

   Feedback and discussion are welcome at https://github.com/quicwg/qlog
   (https://github.com/quicwg/qlog).  Readers are advised to refer to
   the "editor's draft" at that URL for an up-to-date version of this
   document.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-13"/>
        </reference>
        <reference anchor="RFC9110">
          <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="RFC9113">
          <front>
            <title>HTTP/2</title>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <author fullname="C. Benfield" initials="C." role="editor" surname="Benfield"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification describes an optimized expression of the semantics of the Hypertext Transfer Protocol (HTTP), referred to as HTTP version 2 (HTTP/2). HTTP/2 enables a more efficient use of network resources and a reduced latency by introducing field compression and allowing multiple concurrent exchanges on the same connection.</t>
              <t>This document obsoletes RFCs 7540 and 8740.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9113"/>
          <seriesInfo name="DOI" value="10.17487/RFC9113"/>
        </reference>
        <reference anchor="ALTSVC">
          <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="ORIGIN">
          <front>
            <title>The ORIGIN HTTP/2 Frame</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="E. Nygren" initials="E." surname="Nygren"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document specifies the ORIGIN frame for HTTP/2, to indicate what origins are available on a given connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8336"/>
          <seriesInfo name="DOI" value="10.17487/RFC8336"/>
        </reference>
        <reference anchor="EXTENDED-CONNECT">
          <front>
            <title>Bootstrapping WebSockets with HTTP/2</title>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <date month="September" year="2018"/>
            <abstract>
              <t>This document defines a mechanism for running the WebSocket Protocol (RFC 6455) over a single stream of an HTTP/2 connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8441"/>
          <seriesInfo name="DOI" value="10.17487/RFC8441"/>
        </reference>
        <reference anchor="EXTENSIBLE_PRIORITIZATION">
          <front>
            <title>Extensible Prioritization Scheme for HTTP</title>
            <author fullname="K. Oku" initials="K." surname="Oku"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This document describes a scheme that allows an HTTP client to communicate its preferences for how the upstream server prioritizes responses to its requests, and also allows a server to hint to a downstream intermediary how its responses should be prioritized when they are forwarded. This document defines the Priority header field for communicating the initial priority in an HTTP version-independent manner, as well as HTTP/2 and HTTP/3 frames for reprioritizing responses. These share a common format structure that is designed to provide future extensibility.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9218"/>
          <seriesInfo name="DOI" value="10.17487/RFC9218"/>
        </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>
        <reference anchor="CDDL">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC7541">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7541"/>
          <seriesInfo name="DOI" value="10.17487/RFC7541"/>
        </reference>
      </references>
    </references>
    <?line 596?>

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

-->

</rfc>
