feat(body): require Sync when wrapping a dynamic Stream
This commit is contained in:
@@ -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()))
|
||||||
|
|||||||
Reference in New Issue
Block a user