rama_http/layer/
body_limit.rs1use crate::{Body, Request, StreamingBody, body::util::Limited};
33use rama_core::{Layer, Service, bytes::Bytes, error::BoxError};
34use rama_utils::macros::define_inner_service_accessors;
35use std::fmt;
36
37#[derive(Debug, Clone)]
41pub struct BodyLimitLayer {
42 size: usize,
43}
44
45impl BodyLimitLayer {
46 #[must_use]
48 pub const fn new(size: usize) -> Self {
49 Self { size }
50 }
51}
52
53impl<S> Layer<S> for BodyLimitLayer {
54 type Service = BodyLimitService<S>;
55
56 fn layer(&self, inner: S) -> Self::Service {
57 BodyLimitService::new(inner, self.size)
58 }
59}
60
61#[derive(Clone)]
65pub struct BodyLimitService<S> {
66 inner: S,
67 size: usize,
68}
69
70impl<S> BodyLimitService<S> {
71 pub const fn new(service: S, size: usize) -> Self {
73 Self {
74 inner: service,
75 size,
76 }
77 }
78
79 define_inner_service_accessors!();
80}
81
82impl<S, ReqBody> Service<Request<ReqBody>> for BodyLimitService<S>
83where
84 S: Service<Request<Body>>,
85 ReqBody: StreamingBody<Data = Bytes, Error: Into<BoxError>> + Send + Sync + 'static,
86{
87 type Output = S::Output;
88 type Error = S::Error;
89
90 async fn serve(&self, req: Request<ReqBody>) -> Result<Self::Output, Self::Error> {
91 let req = req.map(|body| {
92 if self.size == 0 {
93 Body::new(body)
94 } else {
95 Body::new(Limited::new(body, self.size))
96 }
97 });
98 self.inner.serve(req).await
99 }
100}
101
102impl<S> fmt::Debug for BodyLimitService<S>
103where
104 S: fmt::Debug,
105{
106 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
107 f.debug_struct("BodyLimitService")
108 .field("inner", &self.inner)
109 .field("size", &self.size)
110 .finish()
111 }
112}