feat(lib): remove stream cargo feature (#2896)

Closes #2855
This commit is contained in:
Oddbjørn Grødem
2022-06-24 00:12:24 +02:00
committed by GitHub
parent a563404033
commit ce72f73464
14 changed files with 251 additions and 389 deletions

View File

@@ -457,92 +457,95 @@ test! {
body: &b"hello"[..],
}
test! {
name: client_get_req_body_sized,
// TODO: Fix this, broken in PR #2896
// test! {
// name: client_get_req_body_sized,
server:
expected: "\
GET / HTTP/1.1\r\n\
content-length: 5\r\n\
host: {addr}\r\n\
\r\n\
hello\
",
reply: REPLY_OK,
// server:
// expected: "\
// GET / HTTP/1.1\r\n\
// content-length: 5\r\n\
// host: {addr}\r\n\
// \r\n\
// hello\
// ",
// reply: REPLY_OK,
client:
request: {
method: GET,
url: "http://{addr}/",
headers: {
"Content-Length" => "5",
},
body: (Body::wrap_stream(Body::from("hello"))),
},
response:
status: OK,
headers: {},
body: None,
}
// client:
// request: {
// method: GET,
// url: "http://{addr}/",
// headers: {
// "Content-Length" => "5",
// },
// body: (Body::wrap_stream(Body::from("hello"))),
// },
// response:
// status: OK,
// headers: {},
// body: None,
// }
test! {
name: client_get_req_body_unknown,
// TODO: Fix this, broken in PR #2896
// test! {
// name: client_get_req_body_unknown,
server:
expected: "\
GET / HTTP/1.1\r\n\
host: {addr}\r\n\
\r\n\
",
reply: REPLY_OK,
// server:
// expected: "\
// GET / HTTP/1.1\r\n\
// host: {addr}\r\n\
// \r\n\
// ",
// reply: REPLY_OK,
client:
request: {
method: GET,
url: "http://{addr}/",
// wrap_steam means we don't know the content-length,
// but we're wrapping a non-empty stream.
//
// But since the headers cannot tell us, and the method typically
// doesn't have a body, the body must be ignored.
body: (Body::wrap_stream(Body::from("hello"))),
},
response:
status: OK,
headers: {},
body: None,
}
// client:
// request: {
// method: GET,
// url: "http://{addr}/",
// // wrap_steam means we don't know the content-length,
// // but we're wrapping a non-empty stream.
// //
// // But since the headers cannot tell us, and the method typically
// // doesn't have a body, the body must be ignored.
// body: (Body::from("hello")),
// },
// response:
// status: OK,
// headers: {},
// body: None,
// }
test! {
name: client_get_req_body_unknown_http10,
// TODO: Fix this, broken in PR #2896
// test! {
// name: client_get_req_body_unknown_http10,
server:
expected: "\
GET / HTTP/1.0\r\n\
host: {addr}\r\n\
\r\n\
",
reply: "HTTP/1.0 200 OK\r\ncontent-length: 0\r\n\r\n",
// server:
// expected: "\
// GET / HTTP/1.0\r\n\
// host: {addr}\r\n\
// \r\n\
// ",
// reply: "HTTP/1.0 200 OK\r\ncontent-length: 0\r\n\r\n",
client:
request: {
method: GET,
url: "http://{addr}/",
headers: {
"transfer-encoding" => "chunked",
},
version: HTTP_10,
// wrap_steam means we don't know the content-length,
// but we're wrapping a non-empty stream.
//
// But since the headers cannot tell us, the body must be ignored.
body: (Body::wrap_stream(Body::from("hello"))),
},
response:
status: OK,
headers: {},
body: None,
}
// client:
// request: {
// method: GET,
// url: "http://{addr}/",
// headers: {
// "transfer-encoding" => "chunked",
// },
// version: HTTP_10,
// // wrap_steam means we don't know the content-length,
// // but we're wrapping a non-empty stream.
// //
// // But since the headers cannot tell us, the body must be ignored.
// body: (Body::from("hello")),
// },
// response:
// status: OK,
// headers: {},
// body: None,
// }
test! {
name: client_post_sized,
@@ -602,32 +605,33 @@ test! {
body: None,
}
test! {
name: client_post_unknown,
// TODO: Fix this, broken in PR #2896
// test! {
// name: client_post_unknown,
server:
expected: "\
POST /chunks HTTP/1.1\r\n\
host: {addr}\r\n\
transfer-encoding: chunked\r\n\
\r\n\
B\r\n\
foo bar baz\r\n\
0\r\n\r\n\
",
reply: REPLY_OK,
// server:
// expected: "\
// POST /chunks HTTP/1.1\r\n\
// host: {addr}\r\n\
// transfer-encoding: chunked\r\n\
// \r\n\
// B\r\n\
// foo bar baz\r\n\
// 0\r\n\r\n\
// ",
// reply: REPLY_OK,
client:
request: {
method: POST,
url: "http://{addr}/chunks",
body: (Body::wrap_stream(Body::from("foo bar baz"))),
},
response:
status: OK,
headers: {},
body: None,
}
// client:
// request: {
// method: POST,
// url: "http://{addr}/chunks",
// body: (Body::from("foo bar baz")),
// },
// response:
// status: OK,
// headers: {},
// body: None,
// }
test! {
name: client_post_empty,
@@ -1661,78 +1665,79 @@ mod dispatch_impl {
assert_eq!(connects.load(Ordering::Relaxed), 2);
}
#[test]
fn client_keep_alive_when_response_before_request_body_ends() {
let _ = pretty_env_logger::try_init();
let server = TcpListener::bind("127.0.0.1:0").unwrap();
let addr = server.local_addr().unwrap();
let rt = support::runtime();
// TODO: Fix this, broken in PR #2896
// #[test]
// fn client_keep_alive_when_response_before_request_body_ends() {
// let _ = pretty_env_logger::try_init();
// let server = TcpListener::bind("127.0.0.1:0").unwrap();
// let addr = server.local_addr().unwrap();
// let rt = support::runtime();
let connector = DebugConnector::new();
let connects = connector.connects.clone();
// let connector = DebugConnector::new();
// let connects = connector.connects.clone();
let client = Client::builder().build(connector);
// let client = Client::builder().build(connector);
let (tx1, rx1) = oneshot::channel();
let (tx2, rx2) = oneshot::channel();
let (tx3, rx3) = oneshot::channel();
thread::spawn(move || {
let mut sock = server.accept().unwrap().0;
sock.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
sock.set_write_timeout(Some(Duration::from_secs(5)))
.unwrap();
let mut buf = [0; 4096];
sock.read(&mut buf).expect("read 1");
sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
.expect("write 1");
// after writing the response, THEN stream the body
let _ = tx1.send(());
// let (tx1, rx1) = oneshot::channel();
// let (tx2, rx2) = oneshot::channel();
// let (tx3, rx3) = oneshot::channel();
// thread::spawn(move || {
// let mut sock = server.accept().unwrap().0;
// sock.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
// sock.set_write_timeout(Some(Duration::from_secs(5)))
// .unwrap();
// let mut buf = [0; 4096];
// sock.read(&mut buf).expect("read 1");
// sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
// .expect("write 1");
// // after writing the response, THEN stream the body
// let _ = tx1.send(());
sock.read(&mut buf).expect("read 2");
let _ = tx2.send(());
// sock.read(&mut buf).expect("read 2");
// let _ = tx2.send(());
let n2 = sock.read(&mut buf).expect("read 3");
assert_ne!(n2, 0);
let second_get = "GET /b HTTP/1.1\r\n";
assert_eq!(s(&buf[..second_get.len()]), second_get);
sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
.expect("write 2");
let _ = tx3.send(());
});
// let n2 = sock.read(&mut buf).expect("read 3");
// assert_ne!(n2, 0);
// let second_get = "GET /b HTTP/1.1\r\n";
// assert_eq!(s(&buf[..second_get.len()]), second_get);
// sock.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n")
// .expect("write 2");
// let _ = tx3.send(());
// });
assert_eq!(connects.load(Ordering::Relaxed), 0);
// assert_eq!(connects.load(Ordering::Relaxed), 0);
let delayed_body = rx1
.then(|_| tokio::time::sleep(Duration::from_millis(200)))
.map(|_| Ok::<_, ()>("hello a"))
.map_err(|_| -> hyper::Error { panic!("rx1") })
.into_stream();
// let delayed_body = rx1
// .then(|_| tokio::time::sleep(Duration::from_millis(200)))
// .map(|_| Ok::<_, ()>("hello a"))
// .map_err(|_| -> hyper::Error { panic!("rx1") })
// .into_stream();
let rx = rx2.expect("thread panicked");
let req = Request::builder()
.method("POST")
.uri(&*format!("http://{}/a", addr))
.body(Body::wrap_stream(delayed_body))
.unwrap();
let client2 = client.clone();
// let rx = rx2.expect("thread panicked");
// let req = Request::builder()
// .method("POST")
// .uri(&*format!("http://{}/a", addr))
// .body(Body::wrap_stream(delayed_body))
// .unwrap();
// let client2 = client.clone();
// req 1
let fut = future::join(client.request(req), rx)
.then(|_| tokio::time::sleep(Duration::from_millis(200)))
// req 2
.then(move |()| {
let rx = rx3.expect("thread panicked");
let req = Request::builder()
.uri(&*format!("http://{}/b", addr))
.body(Body::empty())
.unwrap();
future::join(client2.request(req), rx).map(|r| r.0)
});
// // req 1
// let fut = future::join(client.request(req), rx)
// .then(|_| tokio::time::sleep(Duration::from_millis(200)))
// // req 2
// .then(move |()| {
// let rx = rx3.expect("thread panicked");
// let req = Request::builder()
// .uri(&*format!("http://{}/b", addr))
// .body(Body::empty())
// .unwrap();
// future::join(client2.request(req), rx).map(|r| r.0)
// });
rt.block_on(fut).unwrap();
// rt.block_on(fut).unwrap();
assert_eq!(connects.load(Ordering::Relaxed), 1);
}
// assert_eq!(connects.load(Ordering::Relaxed), 1);
// }
#[tokio::test]
async fn client_keep_alive_eager_when_chunked() {
@@ -2160,11 +2165,11 @@ mod conn {
use bytes::Buf;
use futures_channel::oneshot;
use futures_util::future::{self, poll_fn, FutureExt, TryFutureExt};
use futures_util::StreamExt;
use hyper::upgrade::OnUpgrade;
use tokio::io::{AsyncRead, AsyncReadExt as _, AsyncWrite, AsyncWriteExt as _, ReadBuf};
use tokio::net::{TcpListener as TkTcpListener, TcpStream};
use hyper::body::HttpBody;
use hyper::client::conn;
use hyper::{self, Body, Method, Request, Response, StatusCode};
@@ -2208,7 +2213,7 @@ mod conn {
.unwrap();
let mut res = client.send_request(req).await.expect("send_request");
assert_eq!(res.status(), hyper::StatusCode::OK);
assert!(res.body_mut().next().await.is_none());
assert!(res.body_mut().data().await.is_none());
};
future::join(server, client).await;
@@ -2265,7 +2270,7 @@ mod conn {
res.headers().get("line-folded-header").unwrap(),
"hello world"
);
assert!(res.body_mut().next().await.is_none());
assert!(res.body_mut().data().await.is_none());
};
future::join(server, client).await;
@@ -2321,7 +2326,7 @@ mod conn {
res.headers().get(http::header::CONTENT_LENGTH).unwrap(),
"0"
);
assert!(res.body_mut().next().await.is_none());
assert!(res.body_mut().data().await.is_none());
};
future::join(server, client).await;