Skip to main content

praxis_core/config/
body_limits.rs

1// SPDX-License-Identifier: LGPL-3.0-only
2// Copyright (c) 2024 Shane Utt
3
4//! Body size limit configuration.
5
6use serde::Deserialize;
7
8// -----------------------------------------------------------------------------
9// BodyLimitsConfig
10// -----------------------------------------------------------------------------
11
12/// Global hard ceilings on request and response body size.
13///
14/// ```
15/// use praxis_core::config::BodyLimitsConfig;
16///
17/// let limits: BodyLimitsConfig = serde_yaml::from_str(
18///     r#"
19/// max_request_bytes: 10485760
20/// max_response_bytes: 5242880
21/// "#,
22/// )
23/// .unwrap();
24/// assert_eq!(limits.max_request_bytes, Some(10_485_760));
25/// assert_eq!(limits.max_response_bytes, Some(5_242_880));
26/// ```
27#[derive(Debug, Clone, Default, Deserialize)]
28#[serde(default)]
29pub struct BodyLimitsConfig {
30    /// Maximum request body size in bytes.
31    pub max_request_bytes: Option<usize>,
32
33    /// Maximum response body size in bytes.
34    pub max_response_bytes: Option<usize>,
35}
36
37// -----------------------------------------------------------------------------
38// Tests
39// -----------------------------------------------------------------------------
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44
45    #[test]
46    fn defaults_are_none() {
47        let limits = BodyLimitsConfig::default();
48        assert!(
49            limits.max_request_bytes.is_none(),
50            "max_request_bytes should default to None"
51        );
52        assert!(
53            limits.max_response_bytes.is_none(),
54            "max_response_bytes should default to None"
55        );
56    }
57
58    #[test]
59    fn parse_full_config() {
60        let limits: BodyLimitsConfig = serde_yaml::from_str(
61            r#"
62max_request_bytes: 1048576
63max_response_bytes: 524288
64"#,
65        )
66        .unwrap();
67        assert_eq!(
68            limits.max_request_bytes,
69            Some(1_048_576),
70            "max_request_bytes should be parsed"
71        );
72        assert_eq!(
73            limits.max_response_bytes,
74            Some(524_288),
75            "max_response_bytes should be parsed"
76        );
77    }
78
79    #[test]
80    fn parse_empty_yields_defaults() {
81        let limits: BodyLimitsConfig = serde_yaml::from_str("{}").unwrap();
82        assert!(
83            limits.max_request_bytes.is_none(),
84            "max_request_bytes should default to None"
85        );
86        assert!(
87            limits.max_response_bytes.is_none(),
88            "max_response_bytes should default to None"
89        );
90    }
91}