form_data/
limits.rs

1use serde::{Deserialize, Serialize};
2
3/// Various limits on incoming data
4#[derive(Debug, Clone, Deserialize, Serialize)]
5pub struct Limits {
6    /// Max field name size
7    pub field_name_size: Option<usize>,
8    /// Max field value size
9    pub field_size: Option<usize>,
10    /// Max number of non-file fields
11    pub fields: Option<usize>,
12    /// Max file size
13    pub file_size: Option<usize>,
14    /// Max number of file fields
15    pub files: Option<usize>,
16    /// Max number of parts (fields + files)
17    pub parts: Option<usize>,
18    /// Max number of whole stream
19    pub stream_size: Option<u64>,
20    /// Max number of buffer size
21    pub buffer_size: usize,
22}
23
24impl Default for Limits {
25    fn default() -> Self {
26        Self {
27            field_name_size: Some(Self::DEFAULT_FIELD_NAME_SIZE),
28            field_size: Some(Self::DEFAULT_FIELD_SIZE),
29            fields: None,
30            file_size: Some(Self::DEFAULT_FILE_SIZE),
31            files: None,
32            parts: None,
33            stream_size: Some(Self::DEFAULT_STREAM_SIZE),
34            buffer_size: Self::DEFAULT_BUFFER_SIZE,
35        }
36    }
37}
38
39impl Limits {
40    /// Max number of field name size, defaults to 100.
41    pub const DEFAULT_FIELD_NAME_SIZE: usize = 100;
42
43    /// Max number of field value size, defaults to 100KB.
44    pub const DEFAULT_FIELD_SIZE: usize = 100 * 1024;
45
46    /// Max number of file size, defaults to 10MB.
47    pub const DEFAULT_FILE_SIZE: usize = 10 * 1024 * 1024;
48
49    /// Max number of stream size, defaults to 200MB.
50    pub const DEFAULT_STREAM_SIZE: u64 = 200 * 1024 * 1024;
51
52    /// Max number of buffer size, defaults to 8KB
53    pub const DEFAULT_BUFFER_SIZE: usize = 8 * 1024;
54
55    /// Max field name size
56    #[must_use]
57    pub fn field_name_size(mut self, max: usize) -> Self {
58        self.field_name_size.replace(max);
59        self
60    }
61
62    /// Max field value size
63    #[must_use]
64    pub fn field_size(mut self, max: usize) -> Self {
65        self.field_size.replace(max);
66        self
67    }
68
69    /// Max number of non-file fields
70    #[must_use]
71    pub fn fields(mut self, max: usize) -> Self {
72        self.fields.replace(max);
73        self
74    }
75
76    /// Max file size
77    #[must_use]
78    pub fn file_size(mut self, max: usize) -> Self {
79        self.file_size.replace(max);
80        self
81    }
82
83    /// Max number of file fields
84    #[must_use]
85    pub fn files(mut self, max: usize) -> Self {
86        self.files.replace(max);
87        self
88    }
89
90    /// Max number of parts (fields + files)
91    #[must_use]
92    pub fn parts(mut self, max: usize) -> Self {
93        self.parts.replace(max);
94        self
95    }
96
97    /// Max number of buffer size
98    ///
99    /// # Panics
100    ///
101    /// If `max` is greater than or equal to `Limits::DEFAULT_BUFFER_SIZE`.
102    #[must_use]
103    pub fn buffer_size(mut self, max: usize) -> Self {
104        assert!(
105            max >= Self::DEFAULT_BUFFER_SIZE,
106            "The max_buffer_size cannot be smaller than {}.",
107            Self::DEFAULT_BUFFER_SIZE,
108        );
109
110        self.buffer_size = max;
111        self
112    }
113
114    /// Max number of whole stream size
115    #[must_use]
116    pub fn stream_size(mut self, max: u64) -> Self {
117        self.stream_size.replace(max);
118        self
119    }
120
121    /// Check parts
122    #[must_use]
123    pub fn checked_parts(&self, rhs: usize) -> Option<usize> {
124        self.parts.filter(|max| rhs > *max)
125    }
126
127    /// Check fields
128    #[must_use]
129    pub fn checked_fields(&self, rhs: usize) -> Option<usize> {
130        self.fields.filter(|max| rhs > *max)
131    }
132
133    /// Check files
134    #[must_use]
135    pub fn checked_files(&self, rhs: usize) -> Option<usize> {
136        self.files.filter(|max| rhs > *max)
137    }
138
139    /// Check stream size
140    #[must_use]
141    pub fn checked_stream_size(&self, rhs: u64) -> Option<u64> {
142        self.stream_size.filter(|max| rhs > *max)
143    }
144
145    /// Check file size
146    #[must_use]
147    pub fn checked_file_size(&self, rhs: usize) -> Option<usize> {
148        self.file_size.filter(|max| rhs > *max)
149    }
150
151    /// Check field size
152    #[must_use]
153    pub fn checked_field_size(&self, rhs: usize) -> Option<usize> {
154        self.field_size.filter(|max| rhs > *max)
155    }
156
157    /// Check field name size
158    #[must_use]
159    pub fn checked_field_name_size(&self, rhs: usize) -> Option<usize> {
160        self.field_name_size.filter(|max| rhs > *max)
161    }
162}