docs(body): add more docs for Body and Payload
This commit is contained in:
		
							
								
								
									
										41
									
								
								src/body.rs
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								src/body.rs
									
									
									
									
									
								
							| @@ -1,4 +1,19 @@ | |||||||
| //! Streaming bodies for Requests and Responses | //! Streaming bodies for Requests and Responses | ||||||
|  | //! | ||||||
|  | //! For both [Clients](::client) and [Servers](::server), requests and | ||||||
|  | //! responses use streaming bodies, instead of complete buffering. This | ||||||
|  | //! allows applications to not use memory they don't need, and allows exerting | ||||||
|  | //! back-pressure on connections by only reading when asked. | ||||||
|  | //! | ||||||
|  | //! There are two pieces to this in hyper: | ||||||
|  | //! | ||||||
|  | //! - The [`Payload`](Payload) trait the describes all possible bodies. hyper | ||||||
|  | //!   allows any body type that implements `Payload`, allowing applications to | ||||||
|  | //!   have fine-grained control over their streaming. | ||||||
|  | //! - The [`Body`](Body) concrete type, which is an implementation of `Payload`, | ||||||
|  | //!  and returned by hyper as a "receive stream" (so, for server requests and | ||||||
|  | //!  client responses). It is also a decent default implementation if you don't | ||||||
|  | //!  have very custom needs of your send streams. | ||||||
| use std::borrow::Cow; | use std::borrow::Cow; | ||||||
| use std::fmt; | use std::fmt; | ||||||
|  |  | ||||||
| @@ -9,11 +24,14 @@ use h2; | |||||||
| use http::HeaderMap; | use http::HeaderMap; | ||||||
|  |  | ||||||
| use common::Never; | use common::Never; | ||||||
| use super::Chunk; | pub use super::Chunk; | ||||||
|  |  | ||||||
| type BodySender = mpsc::Sender<Result<Chunk, ::Error>>; | type BodySender = mpsc::Sender<Result<Chunk, ::Error>>; | ||||||
|  |  | ||||||
| /// This trait represents a streaming body of a `Request` or `Response`. | /// This trait represents a streaming body of a `Request` or `Response`. | ||||||
|  | /// | ||||||
|  | /// The built-in implementation of this trait is [`Body`](Body), in case you | ||||||
|  | /// don't need to customize a send stream for your own application. | ||||||
| pub trait Payload: Send + 'static { | pub trait Payload: Send + 'static { | ||||||
|     /// A buffer of bytes representing a single chunk of a body. |     /// A buffer of bytes representing a single chunk of a body. | ||||||
|     type Data: AsRef<[u8]> + Send; |     type Data: AsRef<[u8]> + Send; | ||||||
| @@ -86,9 +104,11 @@ impl<E: Payload> Payload for Box<E> { | |||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| /// A `Payload` of `Chunk`s, used when receiving bodies. | /// A stream of `Chunk`s, used when receiving bodies. | ||||||
| /// | /// | ||||||
| /// Also a good default `Payload` to use in many applications. | /// A good default `Payload` to use in many applications. | ||||||
|  | /// | ||||||
|  | /// Also implements `futures::Stream`, so stream combinators may be used. | ||||||
| #[must_use = "streams do nothing unless polled"] | #[must_use = "streams do nothing unless polled"] | ||||||
| pub struct Body { | pub struct Body { | ||||||
|     kind: Kind, |     kind: Kind, | ||||||
| @@ -126,6 +146,10 @@ enum DelayEof { | |||||||
| } | } | ||||||
|  |  | ||||||
| /// A sender half used with `Body::channel()`. | /// A sender half used with `Body::channel()`. | ||||||
|  | /// | ||||||
|  | /// Useful when wanting to stream chunks from another thread. See | ||||||
|  | /// [`Body::channel`](Body::channel) for more. | ||||||
|  | #[must_use = "Sender does nothing unless sent on"] | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct Sender { | pub struct Sender { | ||||||
|     close_rx: oneshot::Receiver<()>, |     close_rx: oneshot::Receiver<()>, | ||||||
| @@ -149,6 +173,8 @@ impl Body { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Create a `Body` stream with an associated sender half. |     /// Create a `Body` stream with an associated sender half. | ||||||
|  |     /// | ||||||
|  |     /// Useful when wanting to stream chunks from another thread. | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn channel() -> (Sender, Body) { |     pub fn channel() -> (Sender, Body) { | ||||||
|         let (tx, rx) = mpsc::channel(0); |         let (tx, rx) = mpsc::channel(0); | ||||||
| @@ -206,6 +232,8 @@ impl Body { | |||||||
|     /// if the stream will not yield any chunks, in all cases. For instance, |     /// if the stream will not yield any chunks, in all cases. For instance, | ||||||
|     /// a streaming body using `chunked` encoding is not able to tell if |     /// a streaming body using `chunked` encoding is not able to tell if | ||||||
|     /// there are more chunks immediately. |     /// there are more chunks immediately. | ||||||
|  |     /// | ||||||
|  |     /// See [`is_end_stream`](Payload::is_end_stream) for a dynamic version. | ||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn is_empty(&self) -> bool { |     pub fn is_empty(&self) -> bool { | ||||||
|         match self.kind { |         match self.kind { | ||||||
| @@ -294,6 +322,7 @@ impl Body { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl Default for Body { | impl Default for Body { | ||||||
|  |     /// Returns [`Body::empty()`](Body::empty). | ||||||
|     #[inline] |     #[inline] | ||||||
|     fn default() -> Body { |     fn default() -> Body { | ||||||
|         Body::empty() |         Body::empty() | ||||||
| @@ -355,13 +384,13 @@ impl fmt::Debug for Body { | |||||||
|  |  | ||||||
| impl Sender { | impl Sender { | ||||||
|     /// Check to see if this `Sender` can send more data. |     /// Check to see if this `Sender` can send more data. | ||||||
|     pub fn poll_ready(&mut self) -> Poll<(), ()> { |     pub fn poll_ready(&mut self) -> Poll<(), ::Error> { | ||||||
|         match self.close_rx.poll() { |         match self.close_rx.poll() { | ||||||
|             Ok(Async::Ready(())) | Err(_) => return Err(()), |             Ok(Async::Ready(())) | Err(_) => return Err(::Error::new_closed()), | ||||||
|             Ok(Async::NotReady) => (), |             Ok(Async::NotReady) => (), | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         self.tx.poll_ready().map_err(|_| ()) |         self.tx.poll_ready().map_err(|_| ::Error::new_closed()) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /// Sends data on this channel. |     /// Sends data on this channel. | ||||||
|   | |||||||
| @@ -49,8 +49,7 @@ pub use http::{ | |||||||
|  |  | ||||||
| pub use client::Client; | pub use client::Client; | ||||||
| pub use error::{Result, Error}; | pub use error::{Result, Error}; | ||||||
| pub use body::{Body}; | pub use body::{Body, Chunk}; | ||||||
| pub use chunk::Chunk; |  | ||||||
| pub use server::Server; | pub use server::Server; | ||||||
|  |  | ||||||
| mod common; | mod common; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user