refactor(body): use HttpBody with extra bounds instead of Payload trait
This commit is contained in:
		
				
					committed by
					
						 Sean McArthur
						Sean McArthur
					
				
			
			
				
	
			
			
			
						parent
						
							203621e3be
						
					
				
				
					commit
					aac0e2dd57
				
			| @@ -22,17 +22,14 @@ pub use self::aggregate::aggregate; | ||||
| pub use self::body::{Body, Sender}; | ||||
| pub use self::to_bytes::to_bytes; | ||||
|  | ||||
| pub(crate) use self::payload::Payload; | ||||
|  | ||||
| mod aggregate; | ||||
| mod body; | ||||
| mod payload; | ||||
| mod to_bytes; | ||||
|  | ||||
| /// An optimization to try to take a full body if immediately available. | ||||
| /// | ||||
| /// This is currently limited to *only* `hyper::Body`s. | ||||
| pub(crate) fn take_full_data<T: Payload + 'static>(body: &mut T) -> Option<T::Data> { | ||||
| pub(crate) fn take_full_data<T: HttpBody + 'static>(body: &mut T) -> Option<T::Data> { | ||||
|     use std::any::{Any, TypeId}; | ||||
|  | ||||
|     // This static type check can be optimized at compile-time. | ||||
|   | ||||
| @@ -1,139 +0,0 @@ | ||||
| use std::error::Error as StdError; | ||||
|  | ||||
| use bytes::Buf; | ||||
| use http::HeaderMap; | ||||
|  | ||||
| use crate::common::{task, Pin, Poll}; | ||||
| use http_body::{Body as HttpBody, SizeHint}; | ||||
|  | ||||
| /// 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: sealed::Sealed + Send + 'static { | ||||
|     /// A buffer of bytes representing a single chunk of a body. | ||||
|     type Data: Buf + Send; | ||||
|  | ||||
|     /// The error type of this stream. | ||||
|     type Error: Into<Box<dyn StdError + Send + Sync>>; | ||||
|  | ||||
|     /// Poll for a `Data` buffer. | ||||
|     /// | ||||
|     /// Similar to `Stream::poll_next`, this yields `Some(Data)` until | ||||
|     /// the body ends, when it yields `None`. | ||||
|     fn poll_data( | ||||
|         self: Pin<&mut Self>, | ||||
|         cx: &mut task::Context<'_>, | ||||
|     ) -> Poll<Option<Result<Self::Data, Self::Error>>>; | ||||
|  | ||||
|     /// Poll for an optional **single** `HeaderMap` of trailers. | ||||
|     /// | ||||
|     /// This should **only** be called after `poll_data` has ended. | ||||
|     /// | ||||
|     /// Note: Trailers aren't currently used for HTTP/1, only for HTTP/2. | ||||
|     fn poll_trailers( | ||||
|         self: Pin<&mut Self>, | ||||
|         _cx: &mut task::Context<'_>, | ||||
|     ) -> Poll<Result<Option<HeaderMap>, Self::Error>> { | ||||
|         Poll::Ready(Ok(None)) | ||||
|     } | ||||
|  | ||||
|     /// A hint that the `Body` is complete, and doesn't need to be polled more. | ||||
|     /// | ||||
|     /// This can be useful to determine if the there is any body or trailers | ||||
|     /// without having to poll. An empty `Body` could return `true` and hyper | ||||
|     /// would be able to know that only the headers need to be sent. Or, it can | ||||
|     /// also be checked after each `poll_data` call, to allow hyper to try to | ||||
|     /// end the underlying stream with the last chunk, instead of needing to | ||||
|     /// send an extra `DATA` frame just to mark the stream as finished. | ||||
|     /// | ||||
|     /// As a hint, it is used to try to optimize, and thus is OK for a default | ||||
|     /// implementation to return `false`. | ||||
|     fn is_end_stream(&self) -> bool { | ||||
|         false | ||||
|     } | ||||
|  | ||||
|     /// Returns a `SizeHint` providing an upper and lower bound on the possible size. | ||||
|     /// | ||||
|     /// If there is an exact size of bytes known, this would allow hyper to | ||||
|     /// send a `Content-Length` header automatically, not needing to fall back to | ||||
|     /// `TransferEncoding: chunked`. | ||||
|     /// | ||||
|     /// This does not need to be kept updated after polls, it will only be | ||||
|     /// called once to create the headers. | ||||
|     fn size_hint(&self) -> SizeHint { | ||||
|         SizeHint::default() | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<T> Payload for T | ||||
| where | ||||
|     T: HttpBody + Send + 'static, | ||||
|     T::Data: Send, | ||||
|     T::Error: Into<Box<dyn StdError + Send + Sync>>, | ||||
| { | ||||
|     type Data = T::Data; | ||||
|     type Error = T::Error; | ||||
|  | ||||
|     fn poll_data( | ||||
|         self: Pin<&mut Self>, | ||||
|         cx: &mut task::Context<'_>, | ||||
|     ) -> Poll<Option<Result<Self::Data, Self::Error>>> { | ||||
|         HttpBody::poll_data(self, cx) | ||||
|     } | ||||
|  | ||||
|     fn poll_trailers( | ||||
|         self: Pin<&mut Self>, | ||||
|         cx: &mut task::Context<'_>, | ||||
|     ) -> Poll<Result<Option<HeaderMap>, Self::Error>> { | ||||
|         HttpBody::poll_trailers(self, cx) | ||||
|     } | ||||
|  | ||||
|     fn is_end_stream(&self) -> bool { | ||||
|         HttpBody::is_end_stream(self) | ||||
|     } | ||||
|  | ||||
|     fn size_hint(&self) -> SizeHint { | ||||
|         HttpBody::size_hint(self) | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl<T> sealed::Sealed for T | ||||
| where | ||||
|     T: HttpBody + Send + 'static, | ||||
|     T::Data: Send, | ||||
|     T::Error: Into<Box<dyn StdError + Send + Sync>>, | ||||
| { | ||||
| } | ||||
|  | ||||
| mod sealed { | ||||
|     pub trait Sealed {} | ||||
| } | ||||
|  | ||||
| /* | ||||
| impl<E: Payload> Payload for Box<E> { | ||||
|     type Data = E::Data; | ||||
|     type Error = E::Error; | ||||
|  | ||||
|     fn poll_data(&mut self) -> Poll<Option<Self::Data>, Self::Error> { | ||||
|         (**self).poll_data() | ||||
|     } | ||||
|  | ||||
|     fn poll_trailers(&mut self) -> Poll<Option<HeaderMap>, Self::Error> { | ||||
|         (**self).poll_trailers() | ||||
|     } | ||||
|  | ||||
|     fn is_end_stream(&self) -> bool { | ||||
|         (**self).is_end_stream() | ||||
|     } | ||||
|  | ||||
|     fn content_length(&self) -> Option<u64> { | ||||
|         (**self).content_length() | ||||
|     } | ||||
|  | ||||
|     #[doc(hidden)] | ||||
|     fn __hyper_full_data(&mut self, arg: FullDataArg) -> FullDataRet<Self::Data> { | ||||
|         (**self).__hyper_full_data(arg) | ||||
|     } | ||||
| } | ||||
| */ | ||||
		Reference in New Issue
	
	Block a user