<?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.6.17 (Ruby 3.0.2) -->
<?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-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>HTTP/3 and QPACK qlog event definitions</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qlog-h3-events-02"/>
    <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="August" day="31"/>
    <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-03"/>
        </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-02"/>
        </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-01">
        <name>Since draft-ietf-quic-qlog-h3-events-01:</name>
        <ul spacing="normal">
          <li>No changes - new draft to prevent expiration</li>
        </ul>
      </section>
      <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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
sPz/BTTwUAi7dwAA

-->

</rfc>
