diff options
Diffstat (limited to 'third_party/rust/qlog/src/events/h3.rs')
-rw-r--r-- | third_party/rust/qlog/src/events/h3.rs | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/third_party/rust/qlog/src/events/h3.rs b/third_party/rust/qlog/src/events/h3.rs new file mode 100644 index 0000000000..eaf3cadf36 --- /dev/null +++ b/third_party/rust/qlog/src/events/h3.rs @@ -0,0 +1,245 @@ +// Copyright (C) 2021, Cloudflare, Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use serde::Deserialize; +use serde::Serialize; + +use super::RawInfo; + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum H3Owner { + Local, + Remote, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum H3StreamType { + Request, + Control, + Push, + Reserved, + Unknown, + QpackEncode, + QpackDecode, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum H3PushDecision { + Claimed, + Abandoned, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum H3PriorityTargetStreamType { + Request, + Push, +} + +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum Http3EventType { + ParametersSet, + ParametersRestored, + StreamTypeSet, + FrameCreated, + FrameParsed, + PushResolved, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum ApplicationError { + HttpNoError, + HttpGeneralProtocolError, + HttpInternalError, + HttpRequestCancelled, + HttpIncompleteRequest, + HttpConnectError, + HttpFrameError, + HttpExcessiveLoad, + HttpVersionFallback, + HttpIdError, + HttpStreamCreationError, + HttpClosedCriticalStream, + HttpEarlyResponse, + HttpMissingSettings, + HttpUnexpectedFrame, + HttpRequestRejection, + HttpSettingsError, + Unknown, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct HttpHeader { + pub name: String, + pub value: String, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct Setting { + pub name: String, + pub value: u64, +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(rename_all = "snake_case")] +pub enum Http3FrameTypeName { + Data, + Headers, + CancelPush, + Settings, + PushPromise, + Goaway, + MaxPushId, + DuplicatePush, + Reserved, + Unknown, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +#[serde(tag = "frame_type")] +#[serde(rename_all = "snake_case")] +// Strictly, the qlog spec says that all these frame types have a frame_type +// field. But instead of making that a rust object property, just use serde to +// ensure it goes out on the wire. This means that deserialization of frames +// also works automatically. +pub enum Http3Frame { + Data { + raw: Option<RawInfo>, + }, + + Headers { + headers: Vec<HttpHeader>, + }, + + CancelPush { + push_id: u64, + }, + + Settings { + settings: Vec<Setting>, + }, + + PushPromise { + push_id: u64, + headers: Vec<HttpHeader>, + }, + + Goaway { + id: u64, + }, + + MaxPushId { + push_id: u64, + }, + + PriorityUpdate { + target_stream_type: H3PriorityTargetStreamType, + prioritized_element_id: u64, + priority_field_value: String, + }, + + Reserved { + length: Option<u64>, + }, + + Unknown { + frame_type_value: u64, + raw: Option<RawInfo>, + }, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3ParametersSet { + pub owner: Option<H3Owner>, + + #[serde(alias = "max_header_list_size")] + pub max_field_section_size: Option<u64>, + pub max_table_capacity: Option<u64>, + pub blocked_streams_count: Option<u64>, + pub enable_connect_protocol: Option<u64>, + pub h3_datagram: Option<u64>, + + // qlog-defined + pub waits_for_settings: Option<bool>, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3ParametersRestored { + #[serde(alias = "max_header_list_size")] + pub max_field_section_size: Option<u64>, + pub max_table_capacity: Option<u64>, + pub blocked_streams_count: Option<u64>, + pub enable_connect_protocol: Option<u64>, + pub h3_datagram: Option<u64>, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3StreamTypeSet { + pub owner: Option<H3Owner>, + pub stream_id: u64, + + pub stream_type: H3StreamType, + + pub associated_push_id: Option<u64>, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3FrameCreated { + pub stream_id: u64, + pub length: Option<u64>, + pub frame: Http3Frame, + + pub raw: Option<RawInfo>, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3FrameParsed { + pub stream_id: u64, + pub length: Option<u64>, + pub frame: Http3Frame, + + pub raw: Option<RawInfo>, +} + +#[serde_with::skip_serializing_none] +#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)] +pub struct H3PushResolved { + push_id: Option<u64>, + stream_id: Option<u64>, + + decision: Option<H3PushDecision>, +} |