pub(crate) mod decoder;
pub(crate) mod dynamic_table;
pub(crate) mod encoder_dynamic_table;
pub(crate) mod static_table;
pub use super::field_section::{FieldSection, PseudoHeaders};
use super::{
compression_error::CompressionError, huffman::HuffmanError, integer_prefix::IntegerPrefixError,
};
pub(crate) use decoder::MalformedRequest;
use dynamic_table::DynamicTable;
pub(crate) use encoder_dynamic_table::HpackEncoder;
#[derive(Debug, thiserror::Error)]
pub(crate) enum HpackDecodeError {
#[error(transparent)]
Compression(#[from] CompressionError),
#[error("malformed request header block: {0:?}")]
MalformedRequest(MalformedRequest),
}
impl From<HuffmanError> for HpackDecodeError {
fn from(e: HuffmanError) -> Self {
Self::Compression(e.into())
}
}
impl From<IntegerPrefixError> for HpackDecodeError {
fn from(e: IntegerPrefixError) -> Self {
Self::Compression(e.into())
}
}
#[derive(Debug)]
pub(crate) struct HpackDecoder {
table: DynamicTable,
protocol_max_table_size: usize,
}
impl HpackDecoder {
pub(crate) fn new(protocol_max_table_size: usize) -> Self {
Self {
table: DynamicTable::new(protocol_max_table_size),
protocol_max_table_size,
}
}
pub(crate) fn decode(
&mut self,
block: &[u8],
) -> Result<FieldSection<'static>, HpackDecodeError> {
decoder::decode(block, &mut self.table, self.protocol_max_table_size)
}
}