1 | //! Streaming bodies for Requests and Responses |
2 | //! |
3 | //! For both [Clients](crate::client) and [Servers](crate::server), requests and |
4 | //! responses use streaming bodies, instead of complete buffering. This |
5 | //! allows applications to not use memory they don't need, and allows exerting |
6 | //! back-pressure on connections by only reading when asked. |
7 | //! |
8 | //! There are two pieces to this in hyper: |
9 | //! |
10 | //! - **The [`Body`] trait** describes all possible bodies. |
11 | //! hyper allows any body type that implements `Body`, allowing |
12 | //! applications to have fine-grained control over their streaming. |
13 | //! - **The [`Incoming`] concrete type**, which is an implementation |
14 | //! of `Body`, and returned by hyper as a "receive stream" (so, for server |
15 | //! requests and client responses). |
16 | //! |
17 | //! There are additional implementations available in [`http-body-util`][], |
18 | //! such as a `Full` or `Empty` body. |
19 | //! |
20 | //! [`http-body-util`]: https://docs.rs/http-body-util |
21 | |
22 | pub use bytes::{Buf, Bytes}; |
23 | pub use http_body::Body; |
24 | pub use http_body::Frame; |
25 | pub use http_body::SizeHint; |
26 | |
27 | pub use self::incoming::Incoming; |
28 | |
29 | #[cfg (all(any(feature = "client" , feature = "server" ), feature = "http1" ))] |
30 | pub(crate) use self::incoming::Sender; |
31 | #[cfg (all( |
32 | any(feature = "http1" , feature = "http2" ), |
33 | any(feature = "client" , feature = "server" ) |
34 | ))] |
35 | pub(crate) use self::length::DecodedLength; |
36 | |
37 | mod incoming; |
38 | #[cfg (all( |
39 | any(feature = "http1" , feature = "http2" ), |
40 | any(feature = "client" , feature = "server" ) |
41 | ))] |
42 | mod length; |
43 | |
44 | fn _assert_send_sync() { |
45 | fn _assert_send<T: Send>() {} |
46 | fn _assert_sync<T: Sync>() {} |
47 | |
48 | _assert_send::<Incoming>(); |
49 | _assert_sync::<Incoming>(); |
50 | } |
51 | |