1use crate::Error;
4
5pub const HARD_MAX_BODY_LEN: usize = 64 * 1024 * 1024;
7pub const HARD_MAX_HEADER_BYTES: usize = 64 * 1024;
9pub const HARD_MAX_HEADER_COUNT: usize = 256;
11pub const HARD_MAX_TARGET_LEN: usize = 8 * 1024;
13pub const HARD_MAX_ID_LEN: usize = 255;
15
16const BHTTP_FIXED_ALLOWANCE: usize = 256;
17const BHTTP_PER_HEADER_ALLOWANCE: usize = 16;
18
19#[derive(Clone, Copy, Debug, Eq, PartialEq)]
21pub struct Limits {
22 pub max_body_len: usize,
24 pub max_header_bytes: usize,
26 pub max_header_count: usize,
28 pub max_target_len: usize,
30}
31
32impl Default for Limits {
33 fn default() -> Self {
34 Self {
35 max_body_len: 8 * 1024 * 1024,
36 max_header_bytes: 16 * 1024,
37 max_header_count: 64,
38 max_target_len: HARD_MAX_TARGET_LEN,
39 }
40 }
41}
42
43impl Limits {
44 pub fn validate(self) -> Result<Self, Error> {
51 if self.max_body_len > HARD_MAX_BODY_LEN
52 || self.max_header_bytes > HARD_MAX_HEADER_BYTES
53 || self.max_header_count > HARD_MAX_HEADER_COUNT
54 || self.max_target_len > HARD_MAX_TARGET_LEN
55 {
56 return Err(Error::InvalidConfiguration);
57 }
58 Ok(self)
59 }
60
61 pub(crate) fn max_encoded_message_len(self) -> usize {
62 self.max_body_len
63 .saturating_add(self.max_header_bytes)
64 .saturating_add(self.max_target_len)
65 .saturating_add(
66 self.max_header_count
67 .saturating_mul(BHTTP_PER_HEADER_ALLOWANCE),
68 )
69 .saturating_add(BHTTP_FIXED_ALLOWANCE)
70 }
71}