Put Stream APIs behind unstable-stream feature
This commit is contained in:
@@ -47,6 +47,13 @@ matrix:
|
|||||||
- rust: beta
|
- rust: beta
|
||||||
env: FEATURES="--features json"
|
env: FEATURES="--features json"
|
||||||
|
|
||||||
|
# optional unstable-stream
|
||||||
|
#- rust: stable
|
||||||
|
- rust: beta
|
||||||
|
env: FEATURES="--features unstable-stream"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# socks
|
# socks
|
||||||
#- rust: stable
|
#- rust: stable
|
||||||
# env: FEATURES="--features socks"
|
# env: FEATURES="--features socks"
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ json = ["serde_json"]
|
|||||||
|
|
||||||
#trust-dns = ["trust-dns-resolver"]
|
#trust-dns = ["trust-dns-resolver"]
|
||||||
|
|
||||||
|
unstable-stream = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
http = "0.1.15"
|
http = "0.1.15"
|
||||||
url = "2.1"
|
url = "2.1"
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ use std::task::{Context, Poll};
|
|||||||
|
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use futures_core::Stream;
|
use futures_core::Stream;
|
||||||
use futures_util::TryStreamExt;
|
|
||||||
use http_body::Body as HttpBody;
|
use http_body::Body as HttpBody;
|
||||||
use tokio::timer::Delay;
|
use tokio::timer::Delay;
|
||||||
|
|
||||||
@@ -55,12 +54,28 @@ impl Body {
|
|||||||
/// let body = Body::wrap_stream(stream);
|
/// let body = Body::wrap_stream(stream);
|
||||||
/// # }
|
/// # }
|
||||||
/// ```
|
/// ```
|
||||||
|
///
|
||||||
|
/// # Unstable
|
||||||
|
///
|
||||||
|
/// This requires the `unstable-stream` feature to be enabled.
|
||||||
|
#[cfg(feature = "unstable-stream")]
|
||||||
pub fn wrap_stream<S>(stream: S) -> Body
|
pub fn wrap_stream<S>(stream: S) -> Body
|
||||||
where
|
where
|
||||||
S: futures_core::stream::TryStream + Send + Sync + 'static,
|
S: futures_core::stream::TryStream + Send + Sync + 'static,
|
||||||
S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
|
S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
|
||||||
hyper::Chunk: From<S::Ok>,
|
hyper::Chunk: From<S::Ok>,
|
||||||
{
|
{
|
||||||
|
Body::stream(stream)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn stream<S>(stream: S) -> Body
|
||||||
|
where
|
||||||
|
S: futures_core::stream::TryStream + Send + Sync + 'static,
|
||||||
|
S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
|
||||||
|
hyper::Chunk: From<S::Ok>,
|
||||||
|
{
|
||||||
|
use futures_util::TryStreamExt;
|
||||||
|
|
||||||
let body = Box::pin(WrapStream(
|
let body = Box::pin(WrapStream(
|
||||||
stream.map_ok(hyper::Chunk::from).map_err(Into::into),
|
stream.map_ok(hyper::Chunk::from).map_err(Into::into),
|
||||||
));
|
));
|
||||||
|
|||||||
@@ -121,7 +121,7 @@ impl Form {
|
|||||||
let last = stream::once(future::ready(Ok(
|
let last = stream::once(future::ready(Ok(
|
||||||
format!("--{}--\r\n", self.boundary()).into()
|
format!("--{}--\r\n", self.boundary()).into()
|
||||||
)));
|
)));
|
||||||
Body::wrap_stream(stream.chain(last))
|
Body::stream(stream.chain(last))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Generate a hyper::Body stream for a single Part instance of a Form request.
|
/// Generate a hyper::Body stream for a single Part instance of a Form request.
|
||||||
@@ -505,7 +505,7 @@ mod tests {
|
|||||||
let mut form = Form::new()
|
let mut form = Form::new()
|
||||||
.part(
|
.part(
|
||||||
"reader1",
|
"reader1",
|
||||||
Part::stream(Body::wrap_stream(stream::once(future::ready::<
|
Part::stream(Body::stream(stream::once(future::ready::<
|
||||||
Result<String, crate::Error>,
|
Result<String, crate::Error>,
|
||||||
>(Ok(
|
>(Ok(
|
||||||
"part1".to_owned(),
|
"part1".to_owned(),
|
||||||
@@ -515,7 +515,7 @@ mod tests {
|
|||||||
.part("key2", Part::text("value2").mime(mime::IMAGE_BMP))
|
.part("key2", Part::text("value2").mime(mime::IMAGE_BMP))
|
||||||
.part(
|
.part(
|
||||||
"reader2",
|
"reader2",
|
||||||
Part::stream(Body::wrap_stream(stream::once(future::ready::<
|
Part::stream(Body::stream(stream::once(future::ready::<
|
||||||
Result<String, crate::Error>,
|
Result<String, crate::Error>,
|
||||||
>(Ok(
|
>(Ok(
|
||||||
"part2".to_owned(),
|
"part2".to_owned(),
|
||||||
|
|||||||
@@ -394,7 +394,7 @@ impl<T: Into<Body>> From<http::Response<T>> for Response {
|
|||||||
/// A `Response` can be piped as the `Body` of another request.
|
/// A `Response` can be piped as the `Body` of another request.
|
||||||
impl From<Response> for Body {
|
impl From<Response> for Body {
|
||||||
fn from(r: Response) -> Body {
|
fn from(r: Response) -> Body {
|
||||||
Body::wrap_stream(r.body)
|
Body::stream(r.body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -156,11 +156,11 @@
|
|||||||
//! - **default-tls** *(enabled by default)*: Provides TLS support via the
|
//! - **default-tls** *(enabled by default)*: Provides TLS support via the
|
||||||
//! `native-tls` library to connect over HTTPS.
|
//! `native-tls` library to connect over HTTPS.
|
||||||
//! - **default-tls-vendored**: Enables the `vendored` feature of `native-tls`.
|
//! - **default-tls-vendored**: Enables the `vendored` feature of `native-tls`.
|
||||||
//! - **rustls-tls**: Provides TLS support via the `rustls` library.
|
|
||||||
//! - **blocking**: Provides the [blocking][] client API.
|
//! - **blocking**: Provides the [blocking][] client API.
|
||||||
//! - **cookies**: Provides cookie session support.
|
//! - **cookies**: Provides cookie session support.
|
||||||
//! - **gzip**: Provides response body gzip decompression.
|
//! - **gzip**: Provides response body gzip decompression.
|
||||||
//! - **json**: Provides serialization and deserialization for JSON bodies.
|
//! - **json**: Provides serialization and deserialization for JSON bodies.
|
||||||
|
//! - **unstable-stream** *(unstable)*: Adds support for `futures::Stream`.
|
||||||
//!
|
//!
|
||||||
//!
|
//!
|
||||||
//! [hyper]: http://hyper.rs
|
//! [hyper]: http://hyper.rs
|
||||||
@@ -173,6 +173,7 @@
|
|||||||
//! [Proxy]: ./struct.Proxy.html
|
//! [Proxy]: ./struct.Proxy.html
|
||||||
//! [cargo-features]: https://doc.rust-lang.org/stable/cargo/reference/manifest.html#the-features-section
|
//! [cargo-features]: https://doc.rust-lang.org/stable/cargo/reference/manifest.html#the-features-section
|
||||||
|
|
||||||
|
////! - **rustls-tls**: Provides TLS support via the `rustls` library.
|
||||||
////! - **socks**: Provides SOCKS5 proxy support.
|
////! - **socks**: Provides SOCKS5 proxy support.
|
||||||
////! - **trust-dns**: Enables a trust-dns async resolver instead of default
|
////! - **trust-dns**: Enables a trust-dns async resolver instead of default
|
||||||
////! threadpool using `getaddrinfo`.
|
////! threadpool using `getaddrinfo`.
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ async fn text_part() {
|
|||||||
assert_eq!(res.status(), reqwest::StatusCode::OK);
|
assert_eq!(res.status(), reqwest::StatusCode::OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable-stream")]
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn stream_part() {
|
async fn stream_part() {
|
||||||
use futures_util::{future, stream};
|
use futures_util::{future, stream};
|
||||||
|
|||||||
Reference in New Issue
Block a user