Skip to content

Commit 6829949

Browse files
committed
Updated hyper and http in test_common
- Major changes. Many of the utility functions have been moved to the new hyper-util - See https://hyper.rs/guides/1/upgrading/
1 parent 9d5159b commit 6829949

File tree

6 files changed

+126
-34
lines changed

6 files changed

+126
-34
lines changed

Cargo.lock

+81-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/test_common/Cargo.toml

+5-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@ doctest = false
1010
path = "test_common.rs"
1111

1212
[dependencies]
13+
bytes = "1"
1314
futures = "0.3"
1415
futures-timer = "3"
15-
hyper = { version = "0.14", features = ["server"] }
16-
http = "0.2"
16+
hyper = { version = "1.4", features = ["http1"] }
17+
hyper-util = { version = "0.1", features = ["tokio", "server", "http1"] }
18+
http = "1.1"
19+
http-body-util = "0.1"
1720
parking_lot = "0.12"
1821
tokio = { version = "1", features = ["full"] }
1922
url = "2"

lib/test_common/test_common.rs

+37-19
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
use log::{debug, info};
2-
use std::{future::Future, io, str::FromStr, sync::Arc, time::Duration};
2+
use std::{future::Future, io, net::SocketAddr, str::FromStr, sync::Arc, time::Duration};
3+
use tokio::net::TcpListener;
34

5+
use bytes::Bytes;
46
use futures::{channel::oneshot, future::select, FutureExt};
57
use futures_timer::Delay;
68
use http::{header, StatusCode};
7-
use hyper::{
8-
server::conn::AddrStream,
9-
service::{make_service_fn, service_fn},
10-
Body, Error, Request, Response, Server,
9+
use http_body_util::{combinators::BoxBody, BodyExt, Empty};
10+
use hyper::{body::Incoming as Body, service::service_fn, Error, Request, Response};
11+
use hyper_util::{
12+
rt::{TokioExecutor, TokioIo},
13+
server::conn::auto::Builder as HyperBuilder,
1114
};
1215
use parking_lot::Mutex;
1316
use url::Url;
1417

15-
async fn echo_route(req: Request<Body>) -> Response<Body> {
18+
async fn echo_route(req: Request<Body>) -> Response<BoxBody<Bytes, hyper::Error>> {
1619
let headers = req.headers();
1720
let content_type = headers
1821
.get(header::CONTENT_TYPE)
@@ -36,24 +39,24 @@ async fn echo_route(req: Request<Body>) -> Response<Body> {
3639
if echo.is_some() {
3740
debug!("Echo Body = {}", echo.clone().unwrap_or_default());
3841
}
39-
let mut response = match (req.method(), echo) {
42+
let mut response: Response<BoxBody<Bytes, Error>> = match (req.method(), echo) {
4043
(&http::Method::GET, Some(b)) => Response::builder()
4144
.status(StatusCode::OK)
4245
.header(header::CONTENT_TYPE, content_type)
43-
.body(b.into())
46+
.body(b.map_err(|never| match never {}).boxed())
4447
.unwrap(),
4548
(&http::Method::POST, _) | (&http::Method::PUT, _) => Response::builder()
4649
.status(StatusCode::OK)
4750
.header(header::CONTENT_TYPE, content_type)
48-
.body(req.into_body())
51+
.body(req.into_body().boxed())
4952
.unwrap(),
5053
_ => Response::builder()
5154
.status(StatusCode::NO_CONTENT)
52-
.body(Body::empty())
55+
.body(empty())
5356
.unwrap(),
5457
};
5558
let ms = wait.and_then(|c| FromStr::from_str(&c).ok()).unwrap_or(0);
56-
let old_body = std::mem::replace(response.body_mut(), Body::empty());
59+
let old_body = std::mem::replace(response.body_mut(), empty());
5760
if ms > 0 {
5861
debug!("waiting {} ms", ms);
5962
}
@@ -62,13 +65,22 @@ async fn echo_route(req: Request<Body>) -> Response<Body> {
6265
response
6366
}
6467

65-
pub fn start_test_server(
68+
fn empty() -> BoxBody<Bytes, hyper::Error> {
69+
Empty::<Bytes>::new()
70+
.map_err(|never| match never {})
71+
.boxed()
72+
}
73+
74+
pub async fn start_test_server(
6675
port: Option<u16>,
6776
) -> (u16, oneshot::Sender<()>, impl Future<Output = ()>) {
6877
let port = port.unwrap_or(0);
69-
let address = ([127, 0, 0, 1], port).into();
78+
let address: SocketAddr = ([127, 0, 0, 1], port).into();
79+
80+
let listener = TcpListener::bind(address).await.unwrap();
81+
let local_addr = listener.local_addr().unwrap();
7082

71-
let make_svc = make_service_fn(|_: &AddrStream| async {
83+
let server = tokio::spawn(async move {
7284
let service = service_fn(|req: Request<Body>| async {
7385
debug!("{:?}", req);
7486
let method = req.method().to_string();
@@ -78,7 +90,7 @@ pub fn start_test_server(
7890
"/" => echo_route(req).await,
7991
_ => Response::builder()
8092
.status(StatusCode::NOT_FOUND)
81-
.body(Body::empty())
93+
.body(empty())
8294
.unwrap(),
8395
};
8496
debug!("{:?}", response);
@@ -92,14 +104,20 @@ pub fn start_test_server(
92104
);
93105
Ok::<_, Error>(response)
94106
});
95-
Ok::<_, Error>(service)
107+
108+
loop {
109+
let (stream, _) = listener.accept().await.unwrap();
110+
let stream = TokioIo::new(stream);
111+
tokio::task::spawn(async move {
112+
let builder = HyperBuilder::new(TokioExecutor::new());
113+
builder.serve_connection(stream, service).await.unwrap();
114+
});
115+
}
96116
});
97117

98118
let (tx, rx) = oneshot::channel();
99119

100-
let server = Server::bind(&address).serve(make_svc);
101-
102-
let port = server.local_addr().port();
120+
let port = local_addr.port();
103121

104122
let future = select(server, rx);
105123

src/bin/test_server.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ fn main() {
88
rt.block_on(async {
99
let port = std::env::var("PORT").ok().and_then(|s| s.parse().ok());
1010
debug!("port = {}", port.unwrap_or_default());
11-
let (port, rx, handle) = start_test_server(port);
11+
let (port, rx, handle) = start_test_server(port).await;
1212

1313
println!("Listening on port {port}");
1414

src/request/request_maker.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ mod tests {
401401
fn sends_request() {
402402
let rt = Runtime::new().unwrap();
403403
rt.block_on(async move {
404-
let (port, ..) = test_common::start_test_server(None);
404+
let (port, ..) = test_common::start_test_server(None).await;
405405
let url = Template::simple(&format!("https://127.0.0.1:{}", port));
406406
let method = Method::GET;
407407
let headers = Vec::new();

tests/integration.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use tokio::runtime::Runtime;
77
fn run_test(path: &str) -> (bool, String, String) {
88
let rt = Runtime::new().unwrap();
99
rt.block_on(async move {
10-
let (port, kill_server, _) = start_test_server(None);
10+
let (port, kill_server, _) = start_test_server(None).await;
1111
env::set_var("PORT", port.to_string());
1212

1313
let (_, ctrlc_channel) = futures::channel::mpsc::unbounded();

0 commit comments

Comments
 (0)