feat(body): require Sync when wrapping a dynamic Stream

This commit is contained in:
Sean McArthur
2019-07-10 16:41:44 -07:00
parent 3524db9473
commit 4441372121

View File

@@ -41,7 +41,11 @@ enum Kind {
content_length: Option<u64>, content_length: Option<u64>,
recv: h2::RecvStream, recv: h2::RecvStream,
}, },
Wrapped(Pin<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send>>), // NOTE: This requires `Sync` because of how easy it is to use `await`
// while a borrow of a `Request<Body>` exists.
//
// See https://github.com/rust-lang/rust/issues/57017
Wrapped(Pin<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync>>),
} }
struct Extra { struct Extra {
@@ -142,7 +146,7 @@ impl Body {
/// ``` /// ```
pub fn wrap_stream<S>(stream: S) -> Body pub fn wrap_stream<S>(stream: S) -> Body
where where
S: TryStream + Send + 'static, S: TryStream + Send + Sync + 'static,
S::Error: Into<Box<dyn StdError + Send + Sync>>, S::Error: Into<Box<dyn StdError + Send + Sync>>,
Chunk: From<S::Ok>, Chunk: From<S::Ok>,
{ {
@@ -411,13 +415,13 @@ impl Stream for Body {
impl impl
From<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send>> From<Box<dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync>>
for Body for Body
{ {
#[inline] #[inline]
fn from( fn from(
stream: Box< stream: Box<
dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send, dyn Stream<Item = Result<Chunk, Box<dyn StdError + Send + Sync>>> + Send + Sync,
>, >,
) -> Body { ) -> Body {
Body::new(Kind::Wrapped(stream.into())) Body::new(Kind::Wrapped(stream.into()))