• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::Body;
2 use bytes::Buf;
3 use std::{
4     fmt,
5     pin::Pin,
6     task::{Context, Poll},
7 };
8 
9 /// A boxed [`Body`] trait object.
10 pub struct BoxBody<D, E> {
11     inner: Pin<Box<dyn Body<Data = D, Error = E> + Send + Sync + 'static>>,
12 }
13 
14 /// A boxed [`Body`] trait object that is !Sync.
15 pub struct UnsyncBoxBody<D, E> {
16     inner: Pin<Box<dyn Body<Data = D, Error = E> + Send + 'static>>,
17 }
18 
19 impl<D, E> BoxBody<D, E> {
20     /// Create a new `BoxBody`.
new<B>(body: B) -> Self where B: Body<Data = D, Error = E> + Send + Sync + 'static, D: Buf,21     pub fn new<B>(body: B) -> Self
22     where
23         B: Body<Data = D, Error = E> + Send + Sync + 'static,
24         D: Buf,
25     {
26         Self {
27             inner: Box::pin(body),
28         }
29     }
30 }
31 
32 impl<D, E> fmt::Debug for BoxBody<D, E> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result33     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34         f.debug_struct("BoxBody").finish()
35     }
36 }
37 
38 impl<D, E> Body for BoxBody<D, E>
39 where
40     D: Buf,
41 {
42     type Data = D;
43     type Error = E;
44 
poll_data( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Self::Data, Self::Error>>>45     fn poll_data(
46         mut self: Pin<&mut Self>,
47         cx: &mut Context<'_>,
48     ) -> Poll<Option<Result<Self::Data, Self::Error>>> {
49         self.inner.as_mut().poll_data(cx)
50     }
51 
poll_trailers( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<Option<http::HeaderMap>, Self::Error>>52     fn poll_trailers(
53         mut self: Pin<&mut Self>,
54         cx: &mut Context<'_>,
55     ) -> Poll<Result<Option<http::HeaderMap>, Self::Error>> {
56         self.inner.as_mut().poll_trailers(cx)
57     }
58 
is_end_stream(&self) -> bool59     fn is_end_stream(&self) -> bool {
60         self.inner.is_end_stream()
61     }
62 
size_hint(&self) -> crate::SizeHint63     fn size_hint(&self) -> crate::SizeHint {
64         self.inner.size_hint()
65     }
66 }
67 
68 impl<D, E> Default for BoxBody<D, E>
69 where
70     D: Buf + 'static,
71 {
default() -> Self72     fn default() -> Self {
73         BoxBody::new(crate::Empty::new().map_err(|err| match err {}))
74     }
75 }
76 
77 // === UnsyncBoxBody ===
78 impl<D, E> UnsyncBoxBody<D, E> {
79     /// Create a new `BoxBody`.
new<B>(body: B) -> Self where B: Body<Data = D, Error = E> + Send + 'static, D: Buf,80     pub fn new<B>(body: B) -> Self
81     where
82         B: Body<Data = D, Error = E> + Send + 'static,
83         D: Buf,
84     {
85         Self {
86             inner: Box::pin(body),
87         }
88     }
89 }
90 
91 impl<D, E> fmt::Debug for UnsyncBoxBody<D, E> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result92     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
93         f.debug_struct("UnsyncBoxBody").finish()
94     }
95 }
96 
97 impl<D, E> Body for UnsyncBoxBody<D, E>
98 where
99     D: Buf,
100 {
101     type Data = D;
102     type Error = E;
103 
poll_data( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Option<Result<Self::Data, Self::Error>>>104     fn poll_data(
105         mut self: Pin<&mut Self>,
106         cx: &mut Context<'_>,
107     ) -> Poll<Option<Result<Self::Data, Self::Error>>> {
108         self.inner.as_mut().poll_data(cx)
109     }
110 
poll_trailers( mut self: Pin<&mut Self>, cx: &mut Context<'_>, ) -> Poll<Result<Option<http::HeaderMap>, Self::Error>>111     fn poll_trailers(
112         mut self: Pin<&mut Self>,
113         cx: &mut Context<'_>,
114     ) -> Poll<Result<Option<http::HeaderMap>, Self::Error>> {
115         self.inner.as_mut().poll_trailers(cx)
116     }
117 
is_end_stream(&self) -> bool118     fn is_end_stream(&self) -> bool {
119         self.inner.is_end_stream()
120     }
121 
size_hint(&self) -> crate::SizeHint122     fn size_hint(&self) -> crate::SizeHint {
123         self.inner.size_hint()
124     }
125 }
126 
127 impl<D, E> Default for UnsyncBoxBody<D, E>
128 where
129     D: Buf + 'static,
130 {
default() -> Self131     fn default() -> Self {
132         UnsyncBoxBody::new(crate::Empty::new().map_err(|err| match err {}))
133     }
134 }
135