Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/server/tracker/inspector/http2/frame/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ pub fn parse(data: &[u8]) -> (usize, Option<Frame>) {
match Frame::try_from((ty, flags, stream_id, &payload[..length])) {
Ok(frame) => (FRAME_HEADER_LEN + length, Some(frame)),
Err(err) => {
tracing::warn!("Failed to parse frame: {:?}", err);
tracing::debug!("Failed to parse frame: {:?}", err);
(FRAME_HEADER_LEN + length, None)
}
}
Expand Down
1 change: 1 addition & 0 deletions src/server/tracker/inspector/http2/frame/priority.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ impl TryFrom<&[u8]> for StreamDependency {

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

Expand Down
84 changes: 30 additions & 54 deletions src/server/tracker/inspector/http2/frame/settings.rs
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
use serde::{Serialize, Serializer};
use serde::Serialize;

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

/// An enum that lists all valid settings that can be sent in a SETTINGS
/// frame.
///
/// Each setting has a value that is a 32 bit unsigned integer (6.5.1.).
#[derive(Debug)]
#[derive(Debug, Serialize)]
pub enum Setting {
HeaderTableSize(u16, u32),
EnablePush(u16, u32),
MaxConcurrentStreams(u16, u32),
InitialWindowSize(u16, u32),
MaxFrameSize(u16, u32),
MaxHeaderListSize(u16, u32),
EnableConnectProtocol(u16, u32),
NoRfc7540Priorities(u16, u32),
Unknown(u16, u32),
HeaderTableSize { id: u16, value: u32 },
EnablePush { id: u16, value: u32 },
MaxConcurrentStreams { id: u16, value: u32 },
InitialWindowSize { id: u16, value: u32 },
MaxFrameSize { id: u16, value: u32 },
MaxHeaderListSize { id: u16, value: u32 },
EnableConnectProtocol { id: u16, value: u32 },
NoRfc7540Priorities { id: u16, value: u32 },
Unknown { id: u16, value: u32 },
}

/// Representing a SETTINGS frame in HTTP/2.
Expand All @@ -32,67 +32,43 @@ pub struct SettingsFrame {
impl From<(u16, u32)> for Setting {
fn from((id, value): (u16, u32)) -> Self {
match id {
1 => Setting::HeaderTableSize(id, value),
2 => Setting::EnablePush(id, value),
3 => Setting::MaxConcurrentStreams(id, value),
4 => Setting::InitialWindowSize(id, value),
5 => Setting::MaxFrameSize(id, value),
6 => Setting::MaxHeaderListSize(id, value),
8 => Setting::EnableConnectProtocol(id, value),
9 => Setting::NoRfc7540Priorities(id, value),
_ => Setting::Unknown(id, value),
1 => Setting::HeaderTableSize { id, value },
2 => Setting::EnablePush { id, value },
3 => Setting::MaxConcurrentStreams { id, value },
4 => Setting::InitialWindowSize { id, value },
5 => Setting::MaxFrameSize { id, value },
6 => Setting::MaxHeaderListSize { id, value },
8 => Setting::EnableConnectProtocol { id, value },
9 => Setting::NoRfc7540Priorities { id, value },
_ => Setting::Unknown { id, value },
}
}
}

impl Setting {
pub fn value(&self) -> (u16, u32) {
match self {
Setting::HeaderTableSize(id, value) => (*id, *value),
Setting::EnablePush(id, value) => (*id, *value),
Setting::MaxConcurrentStreams(id, value) => (*id, *value),
Setting::InitialWindowSize(id, value) => (*id, *value),
Setting::MaxFrameSize(id, value) => (*id, *value),
Setting::MaxHeaderListSize(id, value) => (*id, *value),
Setting::EnableConnectProtocol(id, value) => (*id, *value),
Setting::NoRfc7540Priorities(id, value) => (*id, *value),
Setting::Unknown(id, value) => (*id, *value),
Setting::HeaderTableSize { id, value } => (*id, *value),
Setting::EnablePush { id, value } => (*id, *value),
Setting::MaxConcurrentStreams { id, value } => (*id, *value),
Setting::InitialWindowSize { id, value } => (*id, *value),
Setting::MaxFrameSize { id, value } => (*id, *value),
Setting::MaxHeaderListSize { id, value } => (*id, *value),
Setting::EnableConnectProtocol { id, value } => (*id, *value),
Setting::NoRfc7540Priorities { id, value } => (*id, *value),
Setting::Unknown { id, value } => (*id, *value),
}
}
}

impl Serialize for Setting {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let value = match self {
Setting::HeaderTableSize(_, value) => format!("HEADER_TABLE_SIZE = {value}"),
Setting::EnablePush(_, value) => format!("ENABLE_PUSH = {value}"),
Setting::MaxConcurrentStreams(_, value) => {
format!("MAX_CONCURRENT_STREAMS = {value}")
}
Setting::InitialWindowSize(_, value) => format!("INITIAL_WINDOW_SIZE = {value}"),
Setting::MaxFrameSize(_, value) => format!("MAX_FRAME_SIZE = {value}"),
Setting::MaxHeaderListSize(_, value) => format!("MAX_HEADER_LIST_SIZE = {value}"),
Setting::EnableConnectProtocol(_, value) => {
format!("ENABLE_CONNECT_PROTOCOL = {value}")
}
Setting::NoRfc7540Priorities(_, value) => format!("NO_RFC7540_PRIORITIES = {value}"),
Setting::Unknown(_, value) => format!("UNKNOWN_SETTING = {value}"),
};

serializer.serialize_str(&value)
}
}

// ==== impl SettingsFrame ====

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

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

Expand Down
1 change: 1 addition & 0 deletions src/server/tracker/inspector/http2/frame/window_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ impl TryFrom<&[u8]> for WindowUpdateFrame {

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

Expand Down
Loading