Coverage Report

Created: 2026-01-09 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/qlog-0.15.2/src/events/h3.rs
Line
Count
Source
1
// Copyright (C) 2021, Cloudflare, Inc.
2
// All rights reserved.
3
//
4
// Redistribution and use in source and binary forms, with or without
5
// modification, are permitted provided that the following conditions are
6
// met:
7
//
8
//     * Redistributions of source code must retain the above copyright notice,
9
//       this list of conditions and the following disclaimer.
10
//
11
//     * Redistributions in binary form must reproduce the above copyright
12
//       notice, this list of conditions and the following disclaimer in the
13
//       documentation and/or other materials provided with the distribution.
14
//
15
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16
// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
17
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
19
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27
use serde::Deserialize;
28
use serde::Serialize;
29
30
use super::RawInfo;
31
32
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
33
#[serde(rename_all = "snake_case")]
34
pub enum H3Owner {
35
    Local,
36
    Remote,
37
}
38
39
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, Default)]
40
#[serde(rename_all = "snake_case")]
41
pub enum H3StreamType {
42
    Request,
43
    Control,
44
    Push,
45
    Reserved,
46
    #[default]
47
    Unknown,
48
    QpackEncode,
49
    QpackDecode,
50
}
51
52
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
53
#[serde(rename_all = "snake_case")]
54
pub enum H3PushDecision {
55
    Claimed,
56
    Abandoned,
57
}
58
59
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
60
#[serde(rename_all = "snake_case")]
61
pub enum H3PriorityTargetStreamType {
62
    Request,
63
    Push,
64
}
65
66
#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)]
67
#[serde(rename_all = "snake_case")]
68
pub enum Http3EventType {
69
    ParametersSet,
70
    ParametersRestored,
71
    StreamTypeSet,
72
    FrameCreated,
73
    FrameParsed,
74
    PushResolved,
75
}
76
77
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
78
#[serde(rename_all = "snake_case")]
79
pub enum ApplicationError {
80
    HttpNoError,
81
    HttpGeneralProtocolError,
82
    HttpInternalError,
83
    HttpRequestCancelled,
84
    HttpIncompleteRequest,
85
    HttpConnectError,
86
    HttpFrameError,
87
    HttpExcessiveLoad,
88
    HttpVersionFallback,
89
    HttpIdError,
90
    HttpStreamCreationError,
91
    HttpClosedCriticalStream,
92
    HttpEarlyResponse,
93
    HttpMissingSettings,
94
    HttpUnexpectedFrame,
95
    HttpRequestRejection,
96
    HttpSettingsError,
97
    Unknown,
98
}
99
100
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
101
pub struct HttpHeader {
102
    pub name: String,
103
    pub value: String,
104
}
105
106
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
107
pub struct Setting {
108
    pub name: String,
109
    pub value: u64,
110
}
111
112
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
113
#[serde(rename_all = "snake_case")]
114
pub enum Http3FrameTypeName {
115
    Data,
116
    Headers,
117
    CancelPush,
118
    Settings,
119
    PushPromise,
120
    Goaway,
121
    MaxPushId,
122
    DuplicatePush,
123
    Reserved,
124
    Unknown,
125
}
126
127
#[serde_with::skip_serializing_none]
128
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
129
#[serde(tag = "frame_type")]
130
#[serde(rename_all = "snake_case")]
131
// Strictly, the qlog spec says that all these frame types have a frame_type
132
// field. But instead of making that a rust object property, just use serde to
133
// ensure it goes out on the wire. This means that deserialization of frames
134
// also works automatically.
135
pub enum Http3Frame {
136
    Data {
137
        raw: Option<RawInfo>,
138
    },
139
140
    Headers {
141
        headers: Vec<HttpHeader>,
142
    },
143
144
    CancelPush {
145
        push_id: u64,
146
    },
147
148
    Settings {
149
        settings: Vec<Setting>,
150
    },
151
152
    PushPromise {
153
        push_id: u64,
154
        headers: Vec<HttpHeader>,
155
    },
156
157
    Goaway {
158
        id: u64,
159
    },
160
161
    MaxPushId {
162
        push_id: u64,
163
    },
164
165
    PriorityUpdate {
166
        target_stream_type: H3PriorityTargetStreamType,
167
        prioritized_element_id: u64,
168
        priority_field_value: String,
169
    },
170
171
    Reserved {
172
        length: Option<u64>,
173
    },
174
175
    Unknown {
176
        frame_type_value: u64,
177
        raw: Option<RawInfo>,
178
    },
179
}
180
181
impl Default for Http3Frame {
182
0
    fn default() -> Self {
183
0
        Self::Unknown {
184
0
            frame_type_value: 0,
185
0
            raw: None,
186
0
        }
187
0
    }
188
}
189
190
#[serde_with::skip_serializing_none]
191
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
192
pub struct H3ParametersSet {
193
    pub owner: Option<H3Owner>,
194
195
    #[serde(alias = "max_header_list_size")]
196
    pub max_field_section_size: Option<u64>,
197
    pub max_table_capacity: Option<u64>,
198
    pub blocked_streams_count: Option<u64>,
199
    pub enable_connect_protocol: Option<u64>,
200
    pub h3_datagram: Option<u64>,
201
202
    // qlog-defined
203
    pub waits_for_settings: Option<bool>,
204
}
205
206
#[serde_with::skip_serializing_none]
207
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
208
pub struct H3ParametersRestored {
209
    #[serde(alias = "max_header_list_size")]
210
    pub max_field_section_size: Option<u64>,
211
    pub max_table_capacity: Option<u64>,
212
    pub blocked_streams_count: Option<u64>,
213
    pub enable_connect_protocol: Option<u64>,
214
    pub h3_datagram: Option<u64>,
215
}
216
217
#[serde_with::skip_serializing_none]
218
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, Default)]
219
pub struct H3StreamTypeSet {
220
    pub owner: Option<H3Owner>,
221
    pub stream_id: u64,
222
    pub stream_type: H3StreamType,
223
    pub stream_type_value: Option<u64>,
224
    pub associated_push_id: Option<u64>,
225
}
226
227
#[serde_with::skip_serializing_none]
228
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, Default)]
229
pub struct H3FrameCreated {
230
    pub stream_id: u64,
231
    pub length: Option<u64>,
232
    pub frame: Http3Frame,
233
234
    pub raw: Option<RawInfo>,
235
}
236
237
#[serde_with::skip_serializing_none]
238
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug, Default)]
239
pub struct H3FrameParsed {
240
    pub stream_id: u64,
241
    pub length: Option<u64>,
242
    pub frame: Http3Frame,
243
244
    pub raw: Option<RawInfo>,
245
}
246
247
#[serde_with::skip_serializing_none]
248
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
249
pub struct H3PushResolved {
250
    push_id: Option<u64>,
251
    stream_id: Option<u64>,
252
253
    decision: Option<H3PushDecision>,
254
}