use crate::error::HlsResult;
use std::fmt::{Debug, Formatter};
use reqtls::WriteExt;
#[derive(PartialEq, Copy, Clone)]
#[repr(u16)]
pub enum H2Setting {
HeaderTableSize(u32) = 0x1,
EnablePush(u32) = 0x2,
MaxConcurrentStreams(u32) = 0x3,
InitialWindowSize(u32) = 0x4,
MaxFrameSize(u32) = 0x5,
MaxHeaderListSize(u32) = 0x6,
Reserved { flag: u16, value: u32 },
}
impl H2Setting {
pub fn from_bytes(context: &[u8]) -> HlsResult<H2Setting> {
let flag = u16::from_be_bytes([context[0], context[1]]);
let value = u32::from_be_bytes(context[2..6].try_into()?);
Ok(match flag {
0x1 => H2Setting::HeaderTableSize(value),
0x2 => H2Setting::EnablePush(value),
0x3 => H2Setting::MaxConcurrentStreams(value),
0x4 => H2Setting::InitialWindowSize(value),
0x5 => H2Setting::MaxFrameSize(value),
0x6 => H2Setting::MaxHeaderListSize(value),
_ => H2Setting::Reserved { flag, value },
})
}
pub fn default_setting() -> Vec<H2Setting> {
vec![
H2Setting::HeaderTableSize(65536),
H2Setting::EnablePush(0),
H2Setting::InitialWindowSize(6291456),
H2Setting::MaxHeaderListSize(242144)
]
}
pub fn write_to<W: WriteExt>(&self, writer: &mut W) {
let (flag, value) = match self {
H2Setting::HeaderTableSize(v) => (0x1, v),
H2Setting::EnablePush(v) => (0x1, v),
H2Setting::MaxConcurrentStreams(v) => (0x1, v),
H2Setting::InitialWindowSize(v) => (0x1, v),
H2Setting::MaxFrameSize(v) => (0x1, v),
H2Setting::MaxHeaderListSize(v) => (0x1, v),
H2Setting::Reserved { flag, value } => (*flag, value),
};
writer.write_u16(flag);
writer.write_ru32(value, false);
}
pub fn value(&self) -> &u32 {
match self {
H2Setting::HeaderTableSize(v) => v,
H2Setting::EnablePush(v) => v,
H2Setting::MaxConcurrentStreams(v) => v,
H2Setting::InitialWindowSize(v) => v,
H2Setting::MaxFrameSize(v) => v,
H2Setting::MaxHeaderListSize(v) => v,
H2Setting::Reserved { value, .. } => value
}
}
}
impl Debug for H2Setting {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
H2Setting::HeaderTableSize(v) => write!(f, "HeaderTableSize({})", v),
H2Setting::EnablePush(v) => write!(f, "EnablePush({})", v),
H2Setting::MaxConcurrentStreams(v) => write!(f, "MaxConcurrentStreams({})", v),
H2Setting::InitialWindowSize(v) => write!(f, "InitialWindowSize({})", v),
H2Setting::MaxFrameSize(v) => write!(f, "MaxFrameSize({})", v),
H2Setting::MaxHeaderListSize(v) => write!(f, "MaxHeaderListSize({})", v),
H2Setting::Reserved { flag, value } => write!(f, "Reserved{{flag: {}; value: {}}}", flag, value),
}
}
}