pub(super) struct HpackState {
decoder: crate::protocol::mux::hpack::Decoder,
encoder: crate::protocol::mux::hpack::Encoder,
converter_buf: Vec<u8>,
lowercase_buf: Vec<u8>,
cookie_buf: Vec<u8>,
}
impl HpackState {
pub(super) fn new(
buffers: &mut dyn super::buffer_source::BufferSource,
header_table_size: usize,
) -> Option<Self> {
let converter_buf = buffers.scratch()?;
let lowercase_buf = buffers.scratch()?;
let cookie_buf = buffers.scratch()?;
let mut decoder = crate::protocol::mux::hpack::Decoder::new();
decoder.set_max_allowed_table_size(header_table_size);
Some(HpackState {
decoder,
encoder: crate::protocol::mux::hpack::Encoder::new(),
converter_buf,
lowercase_buf,
cookie_buf,
})
}
pub(super) fn decoder_mut(&mut self) -> &mut crate::protocol::mux::hpack::Decoder {
&mut self.decoder
}
pub(super) fn encoder_mut(&mut self) -> &mut crate::protocol::mux::hpack::Encoder {
&mut self.encoder
}
pub(super) fn set_decoder_max_allowed_table_size(&mut self, size: usize) {
self.decoder.set_max_allowed_table_size(size);
}
pub(super) fn set_encoder_max_table_size(&mut self, size: usize) {
self.encoder.change_max_table_size(size);
}
pub(super) fn reset_encoder_table(&mut self) -> usize {
self.encoder.reset_table()
}
pub(super) fn take_converter_buf(&mut self) -> Vec<u8> {
std::mem::take(&mut self.converter_buf)
}
pub(super) fn take_lowercase_buf(&mut self) -> Vec<u8> {
std::mem::take(&mut self.lowercase_buf)
}
pub(super) fn take_cookie_buf(&mut self) -> Vec<u8> {
std::mem::take(&mut self.cookie_buf)
}
pub(super) fn put_converter_buf(&mut self, buf: Vec<u8>) {
self.converter_buf = buf;
}
pub(super) fn put_lowercase_buf(&mut self, buf: Vec<u8>) {
self.lowercase_buf = buf;
}
pub(super) fn put_cookie_buf(&mut self, buf: Vec<u8>) {
self.cookie_buf = buf;
}
pub(super) fn shrink_converter_buffers(&mut self) {
if self.converter_buf.capacity() > 16_384 {
self.converter_buf.shrink_to(4096);
}
if self.lowercase_buf.capacity() > 16_384 {
self.lowercase_buf.shrink_to(4096);
}
if self.cookie_buf.capacity() > 16_384 {
self.cookie_buf.shrink_to(4096);
}
}
pub(super) fn reclaim_idle_buffers(&mut self, retain_size: usize) {
if self.converter_buf.capacity() > retain_size * 4 {
self.converter_buf.shrink_to(retain_size);
}
if self.lowercase_buf.capacity() > retain_size * 4 {
self.lowercase_buf.shrink_to(retain_size);
}
if self.cookie_buf.capacity() > retain_size * 4 {
self.cookie_buf.shrink_to(retain_size);
}
self.decoder.shrink_scratch(retain_size * 4);
}
}