use serde::Deserialize;
use serde::Serialize;
use super::h3::HttpHeader;
use super::RawInfo;
#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackEventType {
StateUpdated,
StreamStateUpdated,
DynamicTableUpdated,
HeadersEncoded,
HeadersDecoded,
InstructionCreated,
InstructionParsed,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackOwner {
Local,
Remote,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackStreamState {
Blocked,
Unblocked,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackUpdateType {
Added,
Evicted,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackDynamicTableEntry {
pub index: u64,
pub name: Option<String>,
pub value: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackHeaderBlockPrefix {
pub required_insert_count: u64,
pub sign_bit: bool,
pub delta_base: u64,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackInstructionTypeName {
SetDynamicTableCapacityInstruction,
InsertWithNameReferenceInstruction,
InsertWithoutNameReferenceInstruction,
DuplicateInstruction,
HeaderAcknowledgementInstruction,
StreamCancellationInstruction,
InsertCountIncrementInstruction,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackTableType {
Static,
Dynamic,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub enum QPackInstruction {
SetDynamicTableCapacityInstruction {
instruction_type: QpackInstructionTypeName,
capacity: u64,
},
InsertWithNameReferenceInstruction {
instruction_type: QpackInstructionTypeName,
table_type: QpackTableType,
name_index: u64,
huffman_encoded_value: bool,
value_length: u64,
value: String,
},
InsertWithoutNameReferenceInstruction {
instruction_type: QpackInstructionTypeName,
huffman_encoded_name: bool,
name_length: u64,
name: String,
huffman_encoded_value: bool,
value_length: u64,
value: String,
},
DuplicateInstruction {
instruction_type: QpackInstructionTypeName,
index: u64,
},
HeaderAcknowledgementInstruction {
instruction_type: QpackInstructionTypeName,
stream_id: String,
},
StreamCancellationInstruction {
instruction_type: QpackInstructionTypeName,
stream_id: String,
},
InsertCountIncrementInstruction {
instruction_type: QpackInstructionTypeName,
increment: u64,
},
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
#[serde(rename_all = "snake_case")]
pub enum QpackHeaderBlockRepresentationTypeName {
IndexedHeaderField,
LiteralHeaderFieldWithName,
LiteralHeaderFieldWithoutName,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub enum QpackHeaderBlockRepresentation {
IndexedHeaderField {
header_field_type: QpackHeaderBlockRepresentationTypeName,
table_type: QpackTableType,
index: u64,
is_post_base: Option<bool>,
},
LiteralHeaderFieldWithName {
header_field_type: QpackHeaderBlockRepresentationTypeName,
preserve_literal: bool,
table_type: QpackTableType,
name_index: u64,
huffman_encoded_value: bool,
value_length: u64,
value: String,
is_post_base: Option<bool>,
},
LiteralHeaderFieldWithoutName {
header_field_type: QpackHeaderBlockRepresentationTypeName,
preserve_literal: bool,
table_type: QpackTableType,
name_index: u64,
huffman_encoded_name: bool,
name_length: u64,
name: String,
huffman_encoded_value: bool,
value_length: u64,
value: String,
is_post_base: Option<bool>,
},
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackStateUpdated {
pub owner: Option<QpackOwner>,
pub dynamic_table_capacity: Option<u64>,
pub dynamic_table_size: Option<u64>,
pub known_received_count: Option<u64>,
pub current_insert_count: Option<u64>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackStreamStateUpdated {
pub stream_id: u64,
pub state: QpackStreamState,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackDynamicTableUpdated {
pub update_type: QpackUpdateType,
pub entries: Vec<QpackDynamicTableEntry>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackHeadersEncoded {
pub stream_id: Option<u64>,
pub headers: Option<HttpHeader>,
pub block_prefix: QpackHeaderBlockPrefix,
pub header_block: Vec<QpackHeaderBlockRepresentation>,
pub raw: Option<RawInfo>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackHeadersDecoded {
pub stream_id: Option<u64>,
pub headers: Option<HttpHeader>,
pub block_prefix: QpackHeaderBlockPrefix,
pub header_block: Vec<QpackHeaderBlockRepresentation>,
pub raw: Option<RawInfo>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackInstructionCreated {
pub instruction: QPackInstruction,
pub raw: Option<RawInfo>,
}
#[serde_with::skip_serializing_none]
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq, Debug)]
pub struct QpackInstructionParsed {
pub instruction: QPackInstruction,
pub raw: Option<RawInfo>,
}