Skip to content

Commit c91ee06

Browse files
authored
Upgrade hyper to 1.0 (#3543)
1 parent ab0f5bb commit c91ee06

File tree

3 files changed

+131
-40
lines changed

3 files changed

+131
-40
lines changed

Cargo.lock

Lines changed: 96 additions & 21 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

download/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ thiserror.workspace = true
2323
url.workspace = true
2424

2525
[dev-dependencies]
26-
hyper = { version = "0.14", default-features = false, features = ["tcp", "server"] }
26+
http-body-util = "0.1.0"
27+
hyper = { version = "1.0", default-features = false, features = ["server", "http1"] }
28+
hyper-util = { version = "0.1.1", features = ["tokio"] }
2729
tempfile.workspace = true
2830
tokio = { workspace = true, default-features = false, features = ["sync"] }

download/tests/support/mod.rs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ use std::path::Path;
66
use std::sync::mpsc::{channel, Sender};
77
use std::thread;
88

9-
use hyper::server::conn::AddrStream;
10-
use hyper::service::{make_service_fn, service_fn};
11-
use hyper::{Body, Request};
9+
use http_body_util::Full;
10+
use hyper::body::Bytes;
11+
use hyper::server::conn::http1;
12+
use hyper::service::service_fn;
13+
use hyper::Request;
1214
use tempfile::TempDir;
1315

1416
pub fn tmp_dir() -> TempDir {
@@ -31,26 +33,38 @@ pub fn write_file(path: &Path, contents: &str) {
3133
file.sync_data().expect("writing test data");
3234
}
3335

36+
// A dead simple hyper server implementation.
37+
// For more info, see:
38+
// https://hyper.rs/guides/1/server/hello-world/
3439
async fn run_server(addr_tx: Sender<SocketAddr>, addr: SocketAddr, contents: Vec<u8>) {
35-
let make_svc = make_service_fn(|_: &AddrStream| {
40+
let svc = service_fn(move |req: Request<hyper::body::Incoming>| {
3641
let contents = contents.clone();
3742
async move {
38-
Ok::<_, Infallible>(service_fn(move |req: Request<Body>| {
39-
let contents = contents.clone();
40-
async move {
41-
let res = serve_contents(req, contents);
42-
Ok::<_, Infallible>(res)
43-
}
44-
}))
43+
let res = serve_contents(req, contents);
44+
Ok::<_, Infallible>(res)
4545
}
4646
});
4747

48-
let server = hyper::server::Server::bind(&addr).serve(make_svc);
49-
let addr = server.local_addr();
48+
let listener = tokio::net::TcpListener::bind(&addr)
49+
.await
50+
.expect("can not bind");
51+
52+
let addr = listener.local_addr().unwrap();
5053
addr_tx.send(addr).unwrap();
5154

52-
if let Err(e) = server.await {
53-
eprintln!("server error: {e}");
55+
loop {
56+
let (stream, _) = listener
57+
.accept()
58+
.await
59+
.expect("could not accept connection");
60+
let io = hyper_util::rt::TokioIo::new(stream);
61+
62+
let svc = svc.clone();
63+
tokio::spawn(async move {
64+
if let Err(err) = http1::Builder::new().serve_connection(io, svc).await {
65+
eprintln!("failed to serve connection: {:?}", err);
66+
}
67+
});
5468
}
5569
}
5670

@@ -69,9 +83,9 @@ pub fn serve_file(contents: Vec<u8>) -> SocketAddr {
6983
}
7084

7185
fn serve_contents(
72-
req: hyper::Request<hyper::Body>,
86+
req: hyper::Request<hyper::body::Incoming>,
7387
contents: Vec<u8>,
74-
) -> hyper::Response<hyper::Body> {
88+
) -> hyper::Response<Full<Bytes>> {
7589
let mut range_header = None;
7690
let (status, body) = if let Some(range) = req.headers().get(hyper::header::RANGE) {
7791
// extract range "bytes={start}-"
@@ -95,7 +109,7 @@ fn serve_contents(
95109
let mut res = hyper::Response::builder()
96110
.status(status)
97111
.header(hyper::header::CONTENT_LENGTH, body.len())
98-
.body(hyper::Body::from(body))
112+
.body(Full::new(Bytes::from(body)))
99113
.unwrap();
100114
if let Some(range) = range_header {
101115
res.headers_mut()

0 commit comments

Comments
 (0)