Skip to content

Commit 70e5fda

Browse files
authored
feat(http2): refine formatting of SETTINGS frame (#24)
1 parent 949ee9a commit 70e5fda

File tree

4 files changed

+33
-55
lines changed

4 files changed

+33
-55
lines changed

src/server/tracker/inspector/http2/frame/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub fn parse(data: &[u8]) -> (usize, Option<Frame>) {
2929
match Frame::try_from((ty, flags, stream_id, &payload[..length])) {
3030
Ok(frame) => (FRAME_HEADER_LEN + length, Some(frame)),
3131
Err(err) => {
32-
tracing::warn!("Failed to parse frame: {:?}", err);
32+
tracing::debug!("Failed to parse frame: {:?}", err);
3333
(FRAME_HEADER_LEN + length, None)
3434
}
3535
}

src/server/tracker/inspector/http2/frame/priority.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ impl TryFrom<&[u8]> for StreamDependency {
6464

6565
fn try_from(buf: &[u8]) -> Result<Self, Self::Error> {
6666
if buf.len() != 5 {
67+
tracing::debug!("Invalid PRIORITY frame size: {}", buf.len());
6768
return Err(Error::BadFrameSize);
6869
}
6970

src/server/tracker/inspector/http2/frame/settings.rs

Lines changed: 30 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
use serde::{Serialize, Serializer};
1+
use serde::Serialize;
22

33
use super::{error::Error, FrameType};
44

55
/// An enum that lists all valid settings that can be sent in a SETTINGS
66
/// frame.
77
///
88
/// Each setting has a value that is a 32 bit unsigned integer (6.5.1.).
9-
#[derive(Debug)]
9+
#[derive(Debug, Serialize)]
1010
pub enum Setting {
11-
HeaderTableSize(u16, u32),
12-
EnablePush(u16, u32),
13-
MaxConcurrentStreams(u16, u32),
14-
InitialWindowSize(u16, u32),
15-
MaxFrameSize(u16, u32),
16-
MaxHeaderListSize(u16, u32),
17-
EnableConnectProtocol(u16, u32),
18-
NoRfc7540Priorities(u16, u32),
19-
Unknown(u16, u32),
11+
HeaderTableSize { id: u16, value: u32 },
12+
EnablePush { id: u16, value: u32 },
13+
MaxConcurrentStreams { id: u16, value: u32 },
14+
InitialWindowSize { id: u16, value: u32 },
15+
MaxFrameSize { id: u16, value: u32 },
16+
MaxHeaderListSize { id: u16, value: u32 },
17+
EnableConnectProtocol { id: u16, value: u32 },
18+
NoRfc7540Priorities { id: u16, value: u32 },
19+
Unknown { id: u16, value: u32 },
2020
}
2121

2222
/// Representing a SETTINGS frame in HTTP/2.
@@ -32,67 +32,43 @@ pub struct SettingsFrame {
3232
impl From<(u16, u32)> for Setting {
3333
fn from((id, value): (u16, u32)) -> Self {
3434
match id {
35-
1 => Setting::HeaderTableSize(id, value),
36-
2 => Setting::EnablePush(id, value),
37-
3 => Setting::MaxConcurrentStreams(id, value),
38-
4 => Setting::InitialWindowSize(id, value),
39-
5 => Setting::MaxFrameSize(id, value),
40-
6 => Setting::MaxHeaderListSize(id, value),
41-
8 => Setting::EnableConnectProtocol(id, value),
42-
9 => Setting::NoRfc7540Priorities(id, value),
43-
_ => Setting::Unknown(id, value),
35+
1 => Setting::HeaderTableSize { id, value },
36+
2 => Setting::EnablePush { id, value },
37+
3 => Setting::MaxConcurrentStreams { id, value },
38+
4 => Setting::InitialWindowSize { id, value },
39+
5 => Setting::MaxFrameSize { id, value },
40+
6 => Setting::MaxHeaderListSize { id, value },
41+
8 => Setting::EnableConnectProtocol { id, value },
42+
9 => Setting::NoRfc7540Priorities { id, value },
43+
_ => Setting::Unknown { id, value },
4444
}
4545
}
4646
}
4747

4848
impl Setting {
4949
pub fn value(&self) -> (u16, u32) {
5050
match self {
51-
Setting::HeaderTableSize(id, value) => (*id, *value),
52-
Setting::EnablePush(id, value) => (*id, *value),
53-
Setting::MaxConcurrentStreams(id, value) => (*id, *value),
54-
Setting::InitialWindowSize(id, value) => (*id, *value),
55-
Setting::MaxFrameSize(id, value) => (*id, *value),
56-
Setting::MaxHeaderListSize(id, value) => (*id, *value),
57-
Setting::EnableConnectProtocol(id, value) => (*id, *value),
58-
Setting::NoRfc7540Priorities(id, value) => (*id, *value),
59-
Setting::Unknown(id, value) => (*id, *value),
51+
Setting::HeaderTableSize { id, value } => (*id, *value),
52+
Setting::EnablePush { id, value } => (*id, *value),
53+
Setting::MaxConcurrentStreams { id, value } => (*id, *value),
54+
Setting::InitialWindowSize { id, value } => (*id, *value),
55+
Setting::MaxFrameSize { id, value } => (*id, *value),
56+
Setting::MaxHeaderListSize { id, value } => (*id, *value),
57+
Setting::EnableConnectProtocol { id, value } => (*id, *value),
58+
Setting::NoRfc7540Priorities { id, value } => (*id, *value),
59+
Setting::Unknown { id, value } => (*id, *value),
6060
}
6161
}
6262
}
6363

64-
impl Serialize for Setting {
65-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
66-
where
67-
S: Serializer,
68-
{
69-
let value = match self {
70-
Setting::HeaderTableSize(_, value) => format!("HEADER_TABLE_SIZE = {value}"),
71-
Setting::EnablePush(_, value) => format!("ENABLE_PUSH = {value}"),
72-
Setting::MaxConcurrentStreams(_, value) => {
73-
format!("MAX_CONCURRENT_STREAMS = {value}")
74-
}
75-
Setting::InitialWindowSize(_, value) => format!("INITIAL_WINDOW_SIZE = {value}"),
76-
Setting::MaxFrameSize(_, value) => format!("MAX_FRAME_SIZE = {value}"),
77-
Setting::MaxHeaderListSize(_, value) => format!("MAX_HEADER_LIST_SIZE = {value}"),
78-
Setting::EnableConnectProtocol(_, value) => {
79-
format!("ENABLE_CONNECT_PROTOCOL = {value}")
80-
}
81-
Setting::NoRfc7540Priorities(_, value) => format!("NO_RFC7540_PRIORITIES = {value}"),
82-
Setting::Unknown(_, value) => format!("UNKNOWN_SETTING = {value}"),
83-
};
84-
85-
serializer.serialize_str(&value)
86-
}
87-
}
88-
8964
// ==== impl SettingsFrame ====
9065

9166
impl TryFrom<&[u8]> for SettingsFrame {
9267
type Error = Error;
9368

9469
fn try_from(payload: &[u8]) -> Result<Self, Self::Error> {
9570
if payload.is_empty() {
71+
tracing::debug!("Invalid SETTINGS frame size: {}", payload.len());
9672
return Err(Error::BadFrameSize);
9773
}
9874

src/server/tracker/inspector/http2/frame/window_update.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ impl TryFrom<&[u8]> for WindowUpdateFrame {
2525

2626
fn try_from(payload: &[u8]) -> Result<Self, Self::Error> {
2727
if payload.len() != 4 {
28+
tracing::debug!("Invalid WINDOW_UPDATE frame size: {}", payload.len());
2829
return Err(Error::BadFrameSize);
2930
}
3031

0 commit comments

Comments
 (0)