<?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-rfc2629 version 1.6.2 (Ruby 3.0.3) -->
<?rfc docindent="yes"?>
<?rfc strict="yes"?>
<?rfc compact="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-qlog-h3-events-01" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.12.3 -->
  <front>
    <title>HTTP/3 and QPACK qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-01"/>
    <author initials="R." surname="Marx" fullname="Robin Marx">
      <organization>KU Leuven</organization>
      <address>
        <email>robin.marx@kuleuven.be</email>
      </address>
    </author>
    <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
      <organization>Facebook</organization>
      <address>
        <email>lniccolini@fb.com</email>
      </address>
    </author>
    <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
      <organization>Protocol Labs</organization>
      <address>
        <email>marten@protocol.ai</email>
      </address>
    </author>
    <date year="2022" month="March" day="07"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document describes concrete qlog event definitions and their metadata for
HTTP/3 and QPACK-related events. These events can then be embedded in the higher
level schema defined in <xref target="QLOG-MAIN"/>.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes the values of the qlog name ("category" + "event") and
"data" fields and their semantics for the HTTP/3 and QPACK protocols. This
document is based on draft-34 of the HTTP/3 I-D <xref target="QUIC-HTTP"/> and draft-21 of the
QPACK I-D <xref target="QUIC-QPACK"/>. QUIC events are defined in a separate document
<xref target="QLOG-QUIC"/>.</t>
      <t>Feedback and discussion are welcome at
<eref target="https://github.com/quicwg/qlog">https://github.com/quicwg/qlog</eref>.
Readers are advised to refer to the "editor's draft" at that URL for an up-to-date
version of this document.</t>
      <t>Concrete examples of integrations of this schema in
various programming languages can be found at
<eref target="https://github.com/quiclog/qlog/">https://github.com/quiclog/qlog/</eref>.</t>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
interpreted as described in <xref target="RFC2119"/>.</t>
        <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>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <t>This document describes the values of the qlog "name" ("category" + "event") and
"data" fields and their semantics for the HTTP/3 and QPACK protocols.</t>
      <t>This document assumes the usage of the encompassing main qlog schema defined in
<xref target="QLOG-MAIN"/>. Each subsection below defines a separate category (for example http,
qpack) and each subsubsection is an event type (for example <tt>frame_created</tt>).</t>
      <t>For each event type, its importance and data definition is laid out, often
accompanied by possible values for the optional "trigger" field. For the
definition and semantics of "importance" and "trigger", see the main schema
document.</t>
      <t>Most of the complex datastructures, enums and re-usable definitions are grouped
together on the bottom of this document for clarity.</t>
      <section anchor="usage-with-quic">
        <name>Usage with QUIC</name>
        <t>The events described in this document can be used with or without logging the
related QUIC events defined in <xref target="QLOG-QUIC"/>. If used with QUIC events, the QUIC
document takes precedence in terms of recommended filenames and trace separation
setups.</t>
        <t>If used without QUIC events, it is recommended that the implementation assign a
globally unique identifier to each HTTP/3 connection. This ID can then be used as
the value of the qlog "group_id" field, as well as the qlog filename or file
identifier, potentially suffixed by the vantagepoint type (For example,
abcd1234_server.qlog would contain the server-side trace of the connection with
GUID abcd1234).</t>
      </section>
      <section anchor="links-to-the-main-schema">
        <name>Links to the main schema</name>
        <t>This document re-uses all the fields defined in the main qlog schema (e.g., name,
category, type, data, group_id, protocol_type, the time-related fields,
importance, RawInfo, etc.).</t>
        <t>One entry in the "protocol_type" qlog array field MUST be "HTTP3" if events from
this document are included in a qlog trace.</t>
        <section anchor="raw-packet-and-frame-information">
          <name>Raw packet and frame information</name>
          <t>This document re-uses the definition of the RawInfo data class from <xref target="QLOG-MAIN"/>.</t>
          <dl>
            <dt>Note:</dt>
            <dd>
              <t>As HTTP/3 does not use trailers in frames, each HTTP/3 frame header_length can
be calculated as header_length = RawInfo:length - RawInfo:payload_length</t>
            </dd>
            <dt>Note:</dt>
            <dd>
              <t>In some cases, the length fields are also explicitly reflected inside of frame
headers. For example, all HTTP/3 frames include their explicit payload lengths in
the frame header. In these cases, those fields are intentionally preserved in the
event definitions. Even though this can lead to duplicate data when the full
RawInfo is logged, it allows a more direct mapping of the HTTP/3 specifications to
qlog, making it easier for users to interpret. In this case, both fields MUST have
the same value.</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
    <section anchor="http3-and-qpack-event-definitions">
      <name>HTTP/3 and QPACK event definitions</name>
      <t>Each subheading in this section is a qlog event category, while each
sub-subheading is a qlog event type.</t>
      <t>For example, for the following two items, we have the category "http" and event
type "parameters_set", resulting in a concatenated qlog "name" field value of
"http:parameters_set".</t>
      <section anchor="http">
        <name>http</name>
        <t>Note: like all category values, the "http" category is written in lowercase.</t>
        <section anchor="parametersset">
          <name>parameters_set</name>
          <t>Importance: Base</t>
          <t>This event contains HTTP/3 and QPACK-level settings, mostly those received from
the HTTP/3 SETTINGS frame. All these parameters are typically set once and never
change. However, they are typically set at different times during the connection,
so there can be several instances of this event with different fields set.</t>
          <t>Note that some settings have two variations (one set locally, one requested by the
remote peer). This is reflected in the "owner" field. As such, this field MUST be
correct for all settings included a single event instance. If you need to log
settings from two sides, you MUST emit two separate event instances.</t>
          <t>Note: we use the CDDL unwrap operator (~) here to make HTTPParameters
into a re-usable list of fields. The unwrap operator copies the fields
from the referenced type into the target type directly, extending the
target with the unwrapped fields. TODO: explain this better + provide
reference and maybe an example.</t>
          <t>Definition:</t>
          <figure anchor="http-parametersset-def">
            <name>HTTPParametersSet definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPParametersSet = {
    ? owner: Owner

    ~HTTPParameters

    ; qlog-specific
    ; indicates whether this implementation waits for a SETTINGS
    ; frame before processing requests
    ? waits_for_settings: bool
}

HTTPParameters = {
    ? max_header_list_size: uint64
    ? max_table_capacity: uint64
    ? blocked_streams_count: uint64

    ; additional settings for grease and extensions
    * text => uint64
}
]]></sourcecode>
          </figure>
          <t>Note: enabling server push is not explicitly done in HTTP/3 by use of a setting or
parameter. Instead, it is communicated by use of the MAX_PUSH_ID frame, which
should be logged using the frame_created and frame_parsed events below.</t>
          <t>Additionally, this event can contain any number of unspecified fields. This is to
reflect setting of for example unknown (greased) settings or parameters of
(proprietary) extensions.</t>
        </section>
        <section anchor="parametersrestored">
          <name>parameters_restored</name>
          <t>Importance: Base</t>
          <t>When using QUIC 0-RTT, HTTP/3 clients are expected to remember and reuse the
server's SETTINGs from the previous connection. This event is used to indicate
which HTTP/3 settings were restored and to which values when utilizing 0-RTT.</t>
          <t>Definition:</t>
          <figure anchor="http-parametersrestored-def">
            <name>HTTPParametersRestored definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPParametersRestored = {

    ~HTTPParameters

}
]]></sourcecode>
          </figure>
          <t>Note that, like for parameters_set above, this event can contain any number of
unspecified fields to allow for additional and custom settings.</t>
        </section>
        <section anchor="streamtypeset">
          <name>stream_type_set</name>
          <t>Importance: Base</t>
          <t>Emitted when a stream's type becomes known. This is typically when a stream is
opened and the stream's type indicator is sent or received.</t>
          <t>Note: most of this information can also be inferred by looking at a stream's id,
since id's are strictly partitioned at the QUIC level. Even so, this event has a
"Base" importance because it helps a lot in debugging to have this information
clearly spelled out.</t>
          <t>Definition:</t>
          <figure anchor="https-treamtypeset-def">
            <name>HTTPStreamTypeSet definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPStreamTypeSet = {
    ? owner: Owner
    stream_id: uint64

    ? old: HTTPStreamType
    new: HTTPStreamType

    ; only when new === "push"
    ? associated_push_id: uint64
}

HTTPStreamType =  "data" /
                  "control" /
                  "push" /
                  "reserved" /
                  "qpack_encode" /
                  "qpack_decode"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="framecreated">
          <name>frame_created</name>
          <t>Importance: Core</t>
          <t>HTTP equivalent to the packet_sent event. This event is emitted when the HTTP/3
framing actually happens. Note: this is not necessarily the same as when the
HTTP/3 data is passed on to the QUIC layer. For that, see the "data_moved" event
in <xref target="QLOG-QUIC"/>.</t>
          <t>Definition:</t>
          <figure anchor="http-framecreated-def">
            <name>HTTPFrameCreated definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPFrameCreated = {
    stream_id: uint64
    ? length: uint64
    frame: HTTPFrame
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
          <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
created in a streaming fashion. In this case, the frame_created event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
        </section>
        <section anchor="frameparsed">
          <name>frame_parsed</name>
          <t>Importance: Core</t>
          <t>HTTP equivalent to the packet_received event. This event is emitted when we
actually parse the HTTP/3 frame. Note: this is not necessarily the same as when
the HTTP/3 data is actually received on the QUIC layer. For that, see the
"data_moved" event in <xref target="QLOG-QUIC"/>.</t>
          <t>Definition:</t>
          <figure anchor="http-frameparsed-def">
            <name>HTTPFrameParsed definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPFrameParsed = {
    stream_id: uint64
    ? length: uint64
    frame: HTTPFrame
    ? raw: RawInfo
}
]]></sourcecode>
          </figure>
          <t>Note: in HTTP/3, DATA frames can have arbitrarily large lengths to reduce frame
header overhead. As such, DATA frames can span many QUIC packets and can be
processed in a streaming fashion. In this case, the frame_parsed event is emitted
once for the frame header, and further streamed data is indicated using the
data_moved event.</t>
        </section>
        <section anchor="pushresolved">
          <name>push_resolved</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when a pushed resource is successfully claimed (used) or,
conversely, abandoned (rejected) by the application on top of HTTP/3 (e.g., the
web browser). This event is added to help debug problems with unexpected PUSH
behaviour, which is commonplace with HTTP/2.</t>
          <t>Definition:</t>
          <figure anchor="http-pushresolved-def">
            <name>HTTPPushResolved definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPPushResolved = {
    ? push_id: uint64

    ; in case this is logged from a place that does not have access
    ; to the push_id
    ? stream_id: uint64

    decision: HTTPPushDecision
}

HTTPPushDecision = "claimed" / "abandoned"
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="qpack">
        <name>qpack</name>
        <t>Note: like all category values, the "qpack" category is written in lowercase.</t>
        <t>The QPACK events mainly serve as an aid to debug low-level QPACK issues. The
higher-level, plaintext header values SHOULD (also) be logged in the
http.frame_created and http.frame_parsed event data (instead).</t>
        <t>Note: qpack does not have its own parameters_set event. This was merged with
http.parameters_set for brevity, since qpack is a required extension for HTTP/3
anyway. Other HTTP/3 extensions MAY also log their SETTINGS fields in
http.parameters_set or MAY define their own events.</t>
        <section anchor="stateupdated">
          <name>state_updated</name>
          <t>Importance: Base</t>
          <t>This event is emitted when one or more of the internal QPACK variables changes
value. Note that some variables have two variations (one set locally, one
requested by the remote peer). This is reflected in the "owner" field. As such,
this field MUST be correct for all variables included a single event instance. If
you need to log settings from two sides, you MUST emit two separate event
instances.</t>
          <t>Definition:</t>
          <figure anchor="qpack-stateupdate-def">
            <name>QPACKStateUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKStateUpdate = {
    owner: Owner
    ? dynamic_table_capacity: uint64

    ; effective current size, sum of all the entries
    ? dynamic_table_size: uint64
    ? known_received_count: uint64
    ? current_insert_count: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamstateupdated">
          <name>stream_state_updated</name>
          <t>Importance: Core</t>
          <t>This event is emitted when a stream becomes blocked or unblocked by header
decoding requests or QPACK instructions.</t>
          <t>Note: This event is of "Core" importance, as it might have a large impact on
HTTP/3's observed performance.</t>
          <t>Definition:</t>
          <figure anchor="qpack-streamstateupdate-def">
            <name>QPACKStreamStateUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKStreamStateUpdate = {
    stream_id: uint64
    ; streams are assumed to start "unblocked"
    ; until they become "blocked"
    state: QPACKStreamState
}

QPACKStreamState = "blocked" / "unblocked"
]]></sourcecode>
          </figure>
        </section>
        <section anchor="dynamictableupdated">
          <name>dynamic_table_updated</name>
          <t>Importance: Extra</t>
          <t>This event is emitted when one or more entries are inserted or evicted from QPACK's dynamic table.</t>
          <t>Definition:</t>
          <figure anchor="qpack-dynamictableupdate-def">
            <name>QPACKDynamicTableUpdate definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKDynamicTableUpdate = {
    ; local = the encoder's dynamic table
    ; remote = the decoder's dynamic table
    owner: Owner

    update_type: QPACKDynamicTableUpdateType
    entries: [+ QPACKDynamicTableEntry]
}

QPACKDynamicTableUpdateType = "inserted" / "evicted"

QPACKDynamicTableEntry = {
    index: uint64
    ? name: text / hexstring
    ? value: text / hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="headersencoded">
          <name>headers_encoded</name>
          <t>Importance: Base</t>
          <t>This event is emitted when an uncompressed header block is encoded successfully.</t>
          <t>Note: this event has overlap with http.frame_created for the HeadersFrame type.
When outputting both events, implementers MAY omit the "headers" field in this
event.</t>
          <t>Definition:</t>
          <figure anchor="qpack-headersencoded-def">
            <name>QPACKHeadersEncoded definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKHeadersEncoded = {
    ? stream_id: uint64
    ? headers: [+ HTTPField]

    block_prefix: QPACKHeaderBlockPrefix
    header_block: [+ QPACKHeaderBlockRepresentation]

    ? length: uint
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="headersdecoded">
          <name>headers_decoded</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a compressed header block is decoded successfully.</t>
          <t>Note: this event has overlap with http.frame_parsed for the HeadersFrame type.
When outputting both events, implementers MAY omit the "headers" field in this
event.</t>
          <t>Definition:</t>
          <figure anchor="qpack-headersdecoded-def">
            <name>QPACKHeadersDecoded definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKHeadersDecoded = {
    ? stream_id: uint64
    ? headers: [+ HTTPField]

    block_prefix: QPACKHeaderBlockPrefix
    header_block: [+ QPACKHeaderBlockRepresentation]

    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="instructioncreated">
          <name>instruction_created</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a QPACK instruction (both decoder and encoder) is
created and added to the encoder/decoder stream.</t>
          <t>Definition:</t>
          <figure anchor="qpack-instructioncreated-def">
            <name>QPACKInstructionCreated definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKInstructionCreated = {
    ; see definition in appendix
    instruction: QPACKInstruction
    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
          <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
        </section>
        <section anchor="instructionparsed">
          <name>instruction_parsed</name>
          <t>Importance: Base</t>
          <t>This event is emitted when a QPACK instruction (both decoder and encoder) is read
from the encoder/decoder stream.</t>
          <t>Definition:</t>
          <figure anchor="qpack-instructionparsed-def">
            <name>QPACKInstructionParsed definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKInstructionParsed = {
    ; see QPACKInstruction definition in appendix
    instruction: QPACKInstruction

    ? length: uint32
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
          <t>Note: encoder/decoder semantics and stream_id's are implicit in either the
instruction types or can be logged via other events (e.g., http.stream_type_set)</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TBD</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TBD</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="QUIC-HTTP">
          <front>
            <title>Hypertext Transfer Protocol Version 3 (HTTP/3)</title>
            <author initials="M." surname="Bishop" fullname="Mike Bishop" role="editor">
              <organization>Akamai Technologies</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-http-latest"/>
        </reference>
        <reference anchor="QUIC-QPACK">
          <front>
            <title>QPACK: Header Compression for HTTP over QUIC</title>
            <author initials="C." surname="Krasic" fullname="Charles 'Buck' Krasic">
              <organization>Google, Inc</organization>
            </author>
            <author initials="M." surname="Bishop" fullname="Mike Bishop">
              <organization>Akamai Technologies</organization>
            </author>
            <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
              <organization>Facebook</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qpack-latest"/>
        </reference>
        <reference anchor="QLOG-MAIN">
          <front>
            <title>Main logging schema for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-main-schema-02"/>
        </reference>
        <reference anchor="QLOG-QUIC">
          <front>
            <title>QUIC event definitions for qlog</title>
            <author initials="R." surname="Marx" fullname="Robin Marx" role="editor">
              <organization>KU Leuven</organization>
            </author>
            <author initials="L." surname="Niccolini" fullname="Luca Niccolini" role="editor">
              <organization>Facebook</organization>
            </author>
            <author initials="M." surname="Seemann" fullname="Marten Seemann" role="editor">
              <organization>Protocol Labs</organization>
            </author>
            <date/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-quic-events-01"/>
        </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">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <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>
        <name>Informative References</name>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <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>
      </references>
    </references>
    <section anchor="http3-data-field-definitions">
      <name>HTTP/3 data field definitions</name>
      <section anchor="protocoleventbody-extension">
        <name>ProtocolEventBody extension</name>
        <t>We extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN"/> with the HTTP/3 protocol events defined in this document.</t>
        <figure anchor="httpevents-def">
          <name>HTTPEvents definition and ProtocolEventBody extension</name>
          <sourcecode type="cddl"><![CDATA[
HTTPEvents = HTTPParametersSet / HTTPParametersRestored /
             HTTPStreamTypeSet / HTTPFrameCreated /
             HTTPFrameParsed / HTTPPushResolved

$ProtocolEventBody /= HTTPEvents
]]></sourcecode>
        </figure>
      </section>
      <section anchor="owner">
        <name>Owner</name>
        <figure anchor="owner-def">
          <name>Owner definition</name>
          <sourcecode type="cddl"><![CDATA[
Owner = "local" / "remote"
]]></sourcecode>
        </figure>
      </section>
      <section anchor="http3-frames">
        <name>HTTP/3 Frames</name>
        <figure anchor="httpframe-def">
          <name>HTTPFrame definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPFrame =  HTTPDataFrame /
             HTTPHeadersFrame /
             HTTPCancelPushFrame /
             HTTPSettingsFrame /
             HTTPPushPromiseFrame /
             HTTPGoawayFrame /
             HTTPMaxPushIDFrame /
             HTTPReservedFrame /
             UnknownFrame
]]></sourcecode>
        </figure>
        <section anchor="dataframe">
          <name>DataFrame</name>
          <figure anchor="httpdataframe-def">
            <name>HTTPDataFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPDataFrame = {
    frame_type: "data"
    ? raw: hexstring
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="headersframe">
          <name>HeadersFrame</name>
          <t>This represents an <em>uncompressed</em>, plaintext HTTP Headers frame (e.g., no QPACK
compression is applied).</t>
          <t>For example:</t>
          <figure anchor="http-headersframe-ex">
            <name>HTTPHeadersFrame example</name>
            <artwork><![CDATA[
headers: [
  {
    "name": ":path",
    "value": "/"
  },
  {
    "name": ":method",
    "value": "GET"
  },
  {
    "name": ":authority",
    "value": "127.0.0.1:4433"
  },
  {
    "name": ":scheme",
    "value": "https"
  }
]
]]></artwork>
          </figure>
          <figure anchor="http-headersframe-def">
            <name>HTTPHeadersFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPHeadersFrame = {
    frame_type: "headers"
    headers: [* HTTPField]
}
]]></sourcecode>
          </figure>
          <figure anchor="httpfield-def">
            <name>HTTPField definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPField = {
    name: text
    value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="cancelpushframe">
          <name>CancelPushFrame</name>
          <figure anchor="http-cancelpushframe-def">
            <name>HTTPCancelPushFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPCancelPushFrame = {
    frame_type: "cancel_push"
    push_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="settingsframe">
          <name>SettingsFrame</name>
          <figure anchor="httpsettingsframe-def">
            <name>HTTPSettingsFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPSettingsFrame = {
    frame_type: "settings"
    settings: [* HTTPSetting]
}

HTTPSetting = {
    name: text
    value: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="pushpromiseframe">
          <name>PushPromiseFrame</name>
          <figure anchor="httppushpromiseframe-def">
            <name>HTTPPushPromiseFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPPushPromiseFrame = {
    frame_type: "push_promise"
    push_id: uint64
    headers: [* HTTPField]
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="goawayframe">
          <name>GoAwayFrame</name>
          <figure anchor="httpgoawayframe-def">
            <name>HTTPGoawayFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPGoawayFrame = {
    frame_type: "goaway"

    ; Either stream_id or push_id.
    ; This is implicit from the sender of the frame
    id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="maxpushidframe">
          <name>MaxPushIDFrame</name>
          <figure anchor="httpmaxpushidframe-def">
            <name>HTTPMaxPushIDFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPMaxPushIDFrame = {
    frame_type: "max_push_id"
    push_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="reservedframe">
          <name>ReservedFrame</name>
          <figure anchor="httpreservedframe-def">
            <name>HTTPReservedFrame definition</name>
            <sourcecode type="cddl"><![CDATA[
HTTPReservedFrame = {
    frame_type: "reserved"

    ? length: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="unknownframe">
          <name>UnknownFrame</name>
          <t>HTTP/3 qlog re-uses QUIC's UnknownFrame definition, since their values
and usage overlaps. See <xref target="QLOG-QUIC"/>.</t>
        </section>
      </section>
      <section anchor="applicationerror">
        <name>ApplicationError</name>
        <figure anchor="httpapplicationerror-def">
          <name>HTTPApplicationError definition</name>
          <sourcecode type="cddl"><![CDATA[
HTTPApplicationError =  "http_no_error" /
                        "http_general_protocol_error" /
                        "http_internal_error" /
                        "http_stream_creation_error" /
                        "http_closed_critical_stream" /
                        "http_frame_unexpected" /
                        "http_frame_error" /
                        "http_excessive_load" /
                        "http_id_error" /
                        "http_settings_error" /
                        "http_missing_settings" /
                        "http_request_rejected" /
                        "http_request_cancelled" /
                        "http_request_incomplete" /
                        "http_early_response" /
                        "http_connect_error" /
                        "http_version_fallback"
]]></sourcecode>
        </figure>
        <t>The HTTPApplicationError defines the general $ApplicationError
definition in the qlog QUIC definition, see <xref target="QLOG-QUIC"/>.</t>
        <sourcecode type="cddl"><![CDATA[
; ensure HTTP errors are properly validate in QUIC events as well
; e.g., QUIC's ConnectionClose Frame
$ApplicationError /= HTTPApplicationError
]]></sourcecode>
      </section>
    </section>
    <section anchor="qpack-data-type-definitions">
      <name>QPACK DATA type definitions</name>
      <section anchor="protocoleventbody-extension-1">
        <name>ProtocolEventBody extension</name>
        <t>We extend the <tt>$ProtocolEventBody</tt> extension point defined in
<xref target="QLOG-MAIN"/> with the QPACK protocol events defined in this document.</t>
        <figure anchor="qpackevents-def">
          <name>QPACKEvents definition and ProtocolEventBody extension</name>
          <sourcecode type="cddl"><![CDATA[
QPACKEvents = QPACKStateUpdate / QPACKStreamStateUpdate /
              QPACKDynamicTableUpdate / QPACKHeadersEncoded /
              QPACKHeadersDecoded / QPACKInstructionCreated /
              QPACKInstructionParsed

$ProtocolEventBody /= QPACKEvents
]]></sourcecode>
        </figure>
      </section>
      <section anchor="qpack-instructions">
        <name>QPACK Instructions</name>
        <t>Note: the instructions do not have explicit encoder/decoder types, since there is
no overlap between the insturctions of both types in neither name nor function.</t>
        <figure anchor="qpackinstruction-def">
          <name>QPACKInstruction definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKInstruction =  SetDynamicTableCapacityInstruction /
                    InsertWithNameReferenceInstruction /
                    InsertWithoutNameReferenceInstruction /
                    DuplicateInstruction /
                    SectionAcknowledgementInstruction /
                    StreamCancellationInstruction /
                    InsertCountIncrementInstruction
]]></sourcecode>
        </figure>
        <section anchor="setdynamictablecapacityinstruction">
          <name>SetDynamicTableCapacityInstruction</name>
          <figure anchor="setdynamictablecapacityinstruction-def">
            <name>SetDynamicTableCapacityInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
SetDynamicTableCapacityInstruction = {
    instruction_type: "set_dynamic_table_capacity"
    capacity: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertwithnamereferenceinstruction">
          <name>InsertWithNameReferenceInstruction</name>
          <figure anchor="insertwithnamereferenceinstruction-def">
            <name>InsertWithNameReferenceInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertWithNameReferenceInstruction = {
    instruction_type: "insert_with_name_reference"
    table_type: QPACKTableType
    name_index: uint32
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertwithoutnamereferenceinstruction">
          <name>InsertWithoutNameReferenceInstruction</name>
          <figure anchor="insertwithoutnamereferenceinstruction-def">
            <name>InsertWithoutNameReferenceInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertWithoutNameReferenceInstruction = {
    instruction_type: "insert_without_name_reference"
    huffman_encoded_name: bool
    ? name_length: uint32
    ? name: text
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="duplicateinstruction">
          <name>DuplicateInstruction</name>
          <figure anchor="duplicateinstruction-def">
            <name>DuplicateInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
DuplicateInstruction = {
    instruction_type: "duplicate"
    index: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="sectionacknowledgementinstruction">
          <name>SectionAcknowledgementInstruction</name>
          <figure anchor="sectionacknowledgementinstruction-def">
            <name>SectionAcknowledgementInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
SectionAcknowledgementInstruction = {
    instruction_type: "section_acknowledgement"
    stream_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="streamcancellationinstruction">
          <name>StreamCancellationInstruction</name>
          <figure anchor="streamcancellationinstruction-def">
            <name>StreamCancellationInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
StreamCancellationInstruction = {
    instruction_type: "stream_cancellation"
    stream_id: uint64
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="insertcountincrementinstruction">
          <name>InsertCountIncrementInstruction</name>
          <figure anchor="insertcountincrementinstruction-def">
            <name>InsertCountIncrementInstruction definition</name>
            <sourcecode type="cddl"><![CDATA[
InsertCountIncrementInstruction = {
    instruction_type: "insert_count_increment"
    increment: uint32
}
]]></sourcecode>
          </figure>
        </section>
      </section>
      <section anchor="qpack-header-compression">
        <name>QPACK Header compression</name>
        <figure anchor="qpackheaderblockrepresentation-def">
          <name>QPACKHeaderBlockRepresentation definition</name>
          <sourcecode type="cddl"><![CDATA[
QPACKHeaderBlockRepresentation =  IndexedHeaderField /
                                  LiteralHeaderFieldWithName /
                                  LiteralHeaderFieldWithoutName
]]></sourcecode>
        </figure>
        <section anchor="indexedheaderfield">
          <name>IndexedHeaderField</name>
          <t>Note: also used for "indexed header field with post-base index"</t>
          <figure anchor="indexedheaderfield-def">
            <name>IndexedHeaderField definition</name>
            <sourcecode type="cddl"><![CDATA[
IndexedHeaderField = {
    header_field_type: "indexed_header"

    ; MUST be "dynamic" if is_post_base is true
    table_type: QPACKTableType
    index: uint32

    ; to represent the "indexed header field with post-base index"
    ; header field type
    is_post_base: bool .default false
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="literalheaderfieldwithname">
          <name>LiteralHeaderFieldWithName</name>
          <t>Note: also used for "Literal header field with post-base name reference"</t>
          <figure anchor="literalheaderfieldwithname-def">
            <name>LiteralHeaderFieldWithName definition</name>
            <sourcecode type="cddl"><![CDATA[
LiteralHeaderFieldWithName = {
    header_field_type: "literal_with_name"

    ; the 3rd "N" bit
    preserve_literal: bool

    ; MUST be "dynamic" if is_post_base is true
    table_type: QPACKTableType
    name_index: uint32
    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text

    ; to represent the "indexed header field with post-base index"
    ; header field type
    is_post_base: bool .default false
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="literalheaderfieldwithoutname">
          <name>LiteralHeaderFieldWithoutName</name>
          <figure anchor="literalheaderfieldwithoutname-def">
            <name>LiteralHeaderFieldWithoutName definition</name>
            <sourcecode type="cddl"><![CDATA[
LiteralHeaderFieldWithoutName = {
    header_field_type: "literal_without_name"

    ; the 3rd "N" bit
    preserve_literal: bool
    huffman_encoded_name: bool
    ? name_length: uint32
    ? name: text

    huffman_encoded_value: bool
    ? value_length: uint32
    ? value: text
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="qpackheaderblockprefix">
          <name>QPACKHeaderBlockPrefix</name>
          <figure anchor="qpackheaderblockprefix-def">
            <name>QPACKHeaderBlockPrefix definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKHeaderBlockPrefix = {
    required_insert_count: uint32
    sign_bit: bool
    delta_base: uint32
}
]]></sourcecode>
          </figure>
        </section>
        <section anchor="qpacktabletype">
          <name>QPACKTableType</name>
          <figure anchor="qpacktabletype-def">
            <name>QPACKTableType definition</name>
            <sourcecode type="cddl"><![CDATA[
QPACKTableType = "static" / "dynamic"
]]></sourcecode>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="change-log">
      <name>Change Log</name>
      <section anchor="since-draft-ietf-quic-qlog-h3-events-00">
        <name>Since draft-ietf-quic-qlog-h3-events-00:</name>
        <ul spacing="normal">
          <li>Change the data definition language from TypeScript to CDDL (#143)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-02">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-02:</name>
        <ul spacing="normal">
          <li>These changes were done in preparation of the adoption of the drafts by the QUIC
working group (#137)</li>
          <li>Split QUIC and HTTP/3 events into two separate documents</li>
          <li>Moved RawInfo, Importance, Generic events and Simulation events to the main
schema document.</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-01">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-01:</name>
        <t>Major changes:</t>
        <ul spacing="normal">
          <li>Moved data_moved from http to transport. Also made the "from" and "to" fields
flexible strings instead of an enum (#111,#65)</li>
          <li>Moved packet_type fields to PacketHeader. Moved packet_size field out of
PacketHeader to RawInfo:length (#40)</li>
          <li>Made events that need to log packet_type and packet_number use a header field
instead of logging these fields individually</li>
          <li>Added support for logging retry, stateless reset and initial tokens (#94,#86,#117)</li>
          <li>Moved separate general event categories into a single category "generic" (#47)</li>
          <li>Added "transport:connection_closed" event (#43,#85,#78,#49)</li>
          <li>Added version_information and alpn_information events (#85,#75,#28)</li>
          <li>Added parameters_restored events to help clarify 0-RTT behaviour (#88)</li>
        </ul>
        <t>Smaller changes:</t>
        <ul spacing="normal">
          <li>Merged loss_timer events into one loss_timer_updated event</li>
          <li>Field data types are now strongly defined (#10,#39,#36,#115)</li>
          <li>Renamed qpack instruction_received and instruction_sent to instruction_created
and instruction_parsed (#114)</li>
          <li>Updated qpack:dynamic_table_updated.update_type. It now has the value "inserted"
instead of "added" (#113)</li>
          <li>Updated qpack:dynamic_table_updated. It now has an "owner" field to
differentiate encoder vs decoder state (#112)</li>
          <li>Removed push_allowed from http:parameters_set (#110)</li>
          <li>Removed explicit trigger field indications from events, since this was moved to
be a generic property of the "data" field (#80)</li>
          <li>Updated transport:connection_id_updated to be more in line with other similar
events. Also dropped importance from Core to Base (#45)</li>
          <li>Added length property to PaddingFrame (#34)</li>
          <li>Added packet_number field to transport:frames_processed (#74)</li>
          <li>Added a way to generically log packet header flags (first 8 bits) to
PacketHeader</li>
          <li>Added additional guidance on which events to log in which situations (#53)</li>
          <li>Added "simulation:scenario" event to help indicate simulation details</li>
          <li>Added "packets_acked" event (#107)</li>
          <li>Added "datagram_ids" to the datagram_X and packet_X events to allow tracking of
coalesced QUIC packets (#91)</li>
          <li>Extended connection_state_updated with more fine-grained states (#49)</li>
        </ul>
      </section>
      <section anchor="since-draft-marx-qlog-event-definitions-quic-h3-00">
        <name>Since draft-marx-qlog-event-definitions-quic-h3-00:</name>
        <ul spacing="normal">
          <li>Event and category names are now all lowercase</li>
          <li>Added many new events and their definitions</li>
          <li>"type" fields have been made more specific (especially important for PacketType
fields, which are now called packet_type instead of type)</li>
          <li>Events are given an importance indicator (issue #22)</li>
          <li>Event names are more consistent and use past tense (issue #21)</li>
          <li>Triggers have been redefined as properties of the "data" field and updated for most events (issue #23)</li>
        </ul>
      </section>
    </section>
    <section anchor="design-variations">
      <name>Design Variations</name>
      <t>TBD</t>
    </section>
    <section anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Much of the initial work by Robin Marx was done at Hasselt University.</t>
      <t>Thanks to Marten Seemann, Jana Iyengar, Brian Trammell, Dmitri Tikhonov, Stephen
Petrides, Jari Arkko, Marcus Ihlar, Victor Vasiliev, Mirja Kuehlewind, Jeremy
Laine, Kazu Yamamoto, Christian Huitema, and Lucas Pardue for their feedback and
suggestions.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
