use crate::Error;
pub const HARD_MAX_BODY_LEN: usize = 64 * 1024 * 1024;
pub const HARD_MAX_HEADER_BYTES: usize = 64 * 1024;
pub const HARD_MAX_HEADER_COUNT: usize = 256;
pub const HARD_MAX_TARGET_LEN: usize = 8 * 1024;
pub const HARD_MAX_ID_LEN: usize = 255;
const BHTTP_FIXED_ALLOWANCE: usize = 256;
const BHTTP_PER_HEADER_ALLOWANCE: usize = 16;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Limits {
pub max_body_len: usize,
pub max_header_bytes: usize,
pub max_header_count: usize,
pub max_target_len: usize,
}
impl Default for Limits {
fn default() -> Self {
Self {
max_body_len: 8 * 1024 * 1024,
max_header_bytes: 16 * 1024,
max_header_count: 64,
max_target_len: HARD_MAX_TARGET_LEN,
}
}
}
impl Limits {
pub fn validate(self) -> Result<Self, Error> {
if self.max_body_len > HARD_MAX_BODY_LEN
|| self.max_header_bytes > HARD_MAX_HEADER_BYTES
|| self.max_header_count > HARD_MAX_HEADER_COUNT
|| self.max_target_len > HARD_MAX_TARGET_LEN
{
return Err(Error::InvalidConfiguration);
}
Ok(self)
}
pub(crate) fn max_encoded_message_len(self) -> usize {
self.max_body_len
.saturating_add(self.max_header_bytes)
.saturating_add(self.max_target_len)
.saturating_add(
self.max_header_count
.saturating_mul(BHTTP_PER_HEADER_ALLOWANCE),
)
.saturating_add(BHTTP_FIXED_ALLOWANCE)
}
}