From c00e2301c50275b8b8eb2dc1bada62883f82f889 Mon Sep 17 00:00:00 2001 From: Raoul Hidalgo Charman Date: Sun, 24 Mar 2024 13:42:16 +0800 Subject: [PATCH] Update to axum-0.7/hyper-1.2 Hyper (and by extension axum) remove the `Server` struct on 1.0, this keeps the same API but uses axum::serve under the hood, with a slight change to the Error type returned. --- Cargo.lock | 175 +++++++++++------- matchbox_server/Cargo.toml | 2 +- matchbox_server/src/main.rs | 5 +- matchbox_signaling/Cargo.toml | 6 +- matchbox_signaling/src/error.rs | 6 +- .../src/signaling_server/builder.rs | 15 +- .../src/signaling_server/server.rs | 39 ++-- 7 files changed, 137 insertions(+), 111 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c8dd45c3..336cd5a3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -535,7 +535,7 @@ dependencies = [ "futures-util", "log", "pin-project-lite", - "tungstenite 0.21.0", + "tungstenite", ] [[package]] @@ -563,19 +563,20 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.20" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", "axum-core", "base64", - "bitflags 1.3.2", "bytes", "futures-util", - "http 0.2.12", - "http-body", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "hyper", + "hyper-util", "itoa", "matchit", "memchr", @@ -590,27 +591,32 @@ dependencies = [ "sha1", "sync_wrapper", "tokio", - "tokio-tungstenite 0.20.1", + "tokio-tungstenite", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", "futures-util", - "http 0.2.12", - "http-body", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -2676,6 +2682,25 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "h2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ee2dd2e4f378392eeff5d51618cd9a63166a2513846bbc55f21cfacd9199d4" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.1.0", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -2787,6 +2812,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" +dependencies = [ + "bytes", + "futures-core", + "http 1.1.0", + "http-body 1.0.0", + "pin-project-lite", +] + [[package]] name = "http-range-header" version = "0.3.1" @@ -2807,25 +2855,38 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.28" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +checksum = "186548d73ac615b32a73aafe38fb4f56c0d340e110e5a200bcadbaf2e199263a" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", - "http 0.2.12", - "http-body", + "h2", + "http 1.1.0", + "http-body 1.0.0", "httparse", "httpdate", "itoa", "pin-project-lite", + "smallvec", + "tokio", +] + +[[package]] +name = "hyper-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper", + "pin-project-lite", "socket2 0.5.6", "tokio", - "tower-service", - "tracing", - "want", ] [[package]] @@ -3120,8 +3181,8 @@ dependencies = [ "thiserror", "tokio", "tokio-stream", - "tokio-tungstenite 0.21.0", - "tower-http", + "tokio-tungstenite", + "tower-http 0.4.4", "tracing", "tracing-subscriber", "uuid", @@ -3141,8 +3202,8 @@ dependencies = [ "thiserror", "tokio", "tokio-stream", - "tokio-tungstenite 0.21.0", - "tower-http", + "tokio-tungstenite", + "tower-http 0.5.2", "tracing", "tracing-subscriber", "uuid", @@ -4775,18 +4836,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" -dependencies = [ - "futures-util", - "log", - "tokio", - "tungstenite 0.20.1", -] - [[package]] name = "tokio-tungstenite" version = "0.21.0" @@ -4796,7 +4845,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.21.0", + "tungstenite", ] [[package]] @@ -4810,6 +4859,7 @@ dependencies = [ "futures-sink", "pin-project-lite", "tokio", + "tracing", ] [[package]] @@ -4856,7 +4906,7 @@ dependencies = [ "futures-core", "futures-util", "http 0.2.12", - "http-body", + "http-body 0.4.6", "http-range-header", "pin-project-lite", "tower-layer", @@ -4864,6 +4914,23 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.4.2", + "bytes", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower-layer" version = "0.3.2" @@ -4960,37 +5027,12 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "ttf-parser" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" -[[package]] -name = "tungstenite" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http 0.2.12", - "httparse", - "log", - "rand", - "sha1", - "thiserror", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.21.0" @@ -5189,15 +5231,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/matchbox_server/Cargo.toml b/matchbox_server/Cargo.toml index 0a996cee..2247e0b4 100644 --- a/matchbox_server/Cargo.toml +++ b/matchbox_server/Cargo.toml @@ -22,7 +22,7 @@ matchbox_protocol = { version = "0.9", path = "../matchbox_protocol", features = "json", ] } async-trait = "0.1" -axum = { version = "0.6", features = ["ws"] } +axum = { version = "0.7", features = ["ws"] } tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", features = ["env-filter"] } tower-http = { version = "0.4", features = ["cors", "trace"] } diff --git a/matchbox_server/src/main.rs b/matchbox_server/src/main.rs index fd10b5b5..16e60d30 100644 --- a/matchbox_server/src/main.rs +++ b/matchbox_server/src/main.rs @@ -59,10 +59,7 @@ async fn main() { }) .cors() .trace() - .mutate_router(|router| { - // Apply router transformations - router.route("/health", get(|| async { StatusCode::OK })) - }) + .mutate_router(|router| router.route("/health", get(health_handler))) .build(); server .serve() diff --git a/matchbox_signaling/Cargo.toml b/matchbox_signaling/Cargo.toml index c9603520..043a2f53 100644 --- a/matchbox_signaling/Cargo.toml +++ b/matchbox_signaling/Cargo.toml @@ -21,10 +21,10 @@ repository = "https://github.com/johanhelsing/matchbox" matchbox_protocol = { version = "0.9", path = "../matchbox_protocol", features = [ "json", ] } -axum = { version = "0.6", features = ["ws"] } -hyper = { version = "0.14", features = ["server"] } +axum = { version = "0.7", features = ["ws"] } +hyper = { version = "1.2", features = ["server"] } tracing = { version = "0.1", features = ["log"] } -tower-http = { version = "0.4", features = ["cors", "trace"] } +tower-http = { version = "0.5", features = ["cors", "trace"] } tokio = { version = "1.32", features = ["macros", "rt-multi-thread"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/matchbox_signaling/src/error.rs b/matchbox_signaling/src/error.rs index 7331008e..618f1bdb 100644 --- a/matchbox_signaling/src/error.rs +++ b/matchbox_signaling/src/error.rs @@ -13,5 +13,9 @@ pub enum Error { /// Couldn't bind to socket #[error("Bind error: {0}")] - Bind(hyper::Error), + Bind(std::io::Error), + + /// Error on serve + #[error("Serve error: {0}")] + Serve(std::io::Error), } diff --git a/matchbox_signaling/src/signaling_server/builder.rs b/matchbox_signaling/src/signaling_server/builder.rs index c466f142..7afa3dfb 100644 --- a/matchbox_signaling/src/signaling_server/builder.rs +++ b/matchbox_signaling/src/signaling_server/builder.rs @@ -115,28 +115,23 @@ where } /// Create a [`SignalingServer`]. - pub fn build(mut self) -> SignalingServer { + pub fn build(self) -> SignalingServer { // Insert topology let state_machine: SignalingStateMachine = SignalingStateMachine::from_topology(self.topology); - self.router = self + let info = self .router .route("/", get(ws_handler::)) .route("/:path", get(ws_handler::)) .layer(Extension(state_machine)) .layer(Extension(self.shared_callbacks)) .layer(Extension(self.callbacks)) - .layer(Extension(self.state)); - - let info = self - .router + .layer(Extension(self.state)) .into_make_service_with_connect_info::(); - - let socket_addr = self.socket_addr; SignalingServer { + requested_addr: self.socket_addr, info, - requested_addr: socket_addr, - server: None, + listener: None, } } } diff --git a/matchbox_signaling/src/signaling_server/server.rs b/matchbox_signaling/src/signaling_server/server.rs index 1b1ace66..d2ab2044 100644 --- a/matchbox_signaling/src/signaling_server/server.rs +++ b/matchbox_signaling/src/signaling_server/server.rs @@ -6,8 +6,8 @@ use crate::{ }, }; use axum::{extract::connect_info::IntoMakeServiceWithConnectInfo, Router}; -use hyper::{server::conn::AddrIncoming, Server}; -use std::net::SocketAddr; +use std::net::{SocketAddr, TcpListener}; +use tokio::net as tokio; /// Contains the interface end of a signaling server #[derive(Debug)] @@ -18,9 +18,7 @@ pub struct SignalingServer { /// Low-level info for how to build an axum server pub(crate) info: IntoMakeServiceWithConnectInfo, - /// Low-level info for how to build an axum server - pub(crate) server: - Option>>, + pub(crate) listener: Option, } /// Common methods @@ -43,19 +41,17 @@ impl SignalingServer { /// /// The server needs to [`bind`] first pub fn local_addr(&self) -> Option { - self.server.as_ref().map(|s| s.local_addr()) + self.listener.as_ref().map(|l| l.local_addr().unwrap()) } /// Binds the server to a socket /// /// Optional: Will happen automatically on [`serve`] pub fn bind(&mut self) -> Result { - let server = axum::Server::try_bind(&self.requested_addr) - .map_err(crate::Error::Bind)? - .serve(self.info.clone()); - - let addr = server.local_addr(); - self.server = Some(server); + let listener = TcpListener::bind(self.requested_addr).map_err(crate::Error::Bind)?; + listener.set_nonblocking(true).map_err(crate::Error::Bind)?; + let addr = listener.local_addr().unwrap(); + self.listener = Some(listener); Ok(addr) } @@ -63,14 +59,15 @@ impl SignalingServer { /// /// Will bind if not already bound pub async fn serve(mut self) -> Result<(), crate::Error> { - if self.server.is_none() { - self.bind()?; - assert!(self.server.is_some()); - } - - match self.server.expect("no server, this is a bug").await { - Ok(()) => Ok(()), - Err(e) => Err(crate::Error::from(e)), - } + match self.listener { + Some(_) => (), + None => _ = self.bind()?, + }; + let listener = + tokio::TcpListener::from_std(self.listener.expect("No listener, this is a bug!")) + .map_err(crate::Error::Bind)?; + axum::serve(listener, self.info) + .await + .map_err(crate::Error::Serve) } }