Fix return types of serve futures (#3601)

This commit is contained in:
Jonas Platte
2025-12-28 09:25:50 +01:00
committed by GitHub
parent 370c6df40a
commit f3a95d786a
66 changed files with 105 additions and 122 deletions
+4 -4
View File
@@ -438,7 +438,7 @@ pub fn derive_from_request_parts(item: TokenStream) -> TokenStream {
/// let app = Router::new().route("/", get(handler)); /// let app = Router::new().route("/", get(handler));
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, app).await.unwrap(); /// axum::serve(listener, app).await;
/// } /// }
/// ///
/// fn handler() -> &'static str { /// fn handler() -> &'static str {
@@ -458,7 +458,7 @@ pub fn derive_from_request_parts(item: TokenStream) -> TokenStream {
/// # let app = Router::new().route("/", get(handler)); /// # let app = Router::new().route("/", get(handler));
/// # /// #
/// # let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// # let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// # axum::serve(listener, app).await.unwrap(); /// # axum::serve(listener, app).await;
/// # } /// # }
/// # /// #
/// #[debug_handler] /// #[debug_handler]
@@ -485,7 +485,7 @@ pub fn derive_from_request_parts(item: TokenStream) -> TokenStream {
/// let app = Router::new().route("/", get(handler)); /// let app = Router::new().route("/", get(handler));
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, app).await.unwrap(); /// axum::serve(listener, app).await;
/// } /// }
/// ///
/// #[debug_handler] /// #[debug_handler]
@@ -607,7 +607,7 @@ pub fn debug_handler(_attr: TokenStream, input: TokenStream) -> TokenStream {
/// .layer(middleware::from_fn(my_middleware)); /// .layer(middleware::from_fn(my_middleware));
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, app).await.unwrap(); /// axum::serve(listener, app).await;
/// } /// }
/// ///
/// // if this wasn't a valid middleware function #[debug_middleware] would /// // if this wasn't a valid middleware function #[debug_middleware] would
+4
View File
@@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **breaking:** `#[from_request(via(Extractor))]` now uses the extractor's - **breaking:** `#[from_request(via(Extractor))]` now uses the extractor's
rejection type instead of `axum::response::Response` ([#3261]) rejection type instead of `axum::response::Response` ([#3261])
- **breaking:** `axum::serve` now applies hyper's default `header_read_timeout` ([#3478]) - **breaking:** `axum::serve` now applies hyper's default `header_read_timeout` ([#3478])
- **breaking:** `axum::serve` future output type has been adjusted to remove `io::Result`
(never returned `Err`) and be an uninhabited type if `with_graceful_shutdown` is not used
(because it was already never terminating if that method wasn't used) ([#3601])
- **added:** New `ListenerExt::limit_connections` allows limiting concurrent `axum::serve` connections ([#3489]) - **added:** New `ListenerExt::limit_connections` allows limiting concurrent `axum::serve` connections ([#3489])
- **changed:** `serve` has an additional generic argument and can now work with any response body - **changed:** `serve` has an additional generic argument and can now work with any response body
type, not just `axum::body::Body` ([#3205]) type, not just `axum::body::Body` ([#3205])
@@ -19,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
[#3261]: https://github.com/tokio-rs/axum/pull/3261 [#3261]: https://github.com/tokio-rs/axum/pull/3261
[#3205]: https://github.com/tokio-rs/axum/pull/3205 [#3205]: https://github.com/tokio-rs/axum/pull/3205
[#3478]: https://github.com/tokio-rs/axum/pull/3478 [#3478]: https://github.com/tokio-rs/axum/pull/3478
[#3601]: https://github.com/tokio-rs/axum/pull/3601
[#3489]: https://github.com/tokio-rs/axum/pull/3489 [#3489]: https://github.com/tokio-rs/axum/pull/3489
# 0.8.8 # 0.8.8
+1 -1
View File
@@ -54,7 +54,7 @@ async fn main() {
// run our app with hyper, listening globally on port 3000 // run our app with hyper, listening globally on port 3000
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// basic handler that responds with a static string // basic handler that responds with a static string
+2 -2
View File
@@ -163,9 +163,9 @@ impl BenchmarkBuilder {
.unwrap(); .unwrap();
let addr = listener.local_addr().unwrap(); let addr = listener.local_addr().unwrap();
#[allow(unreachable_code)] // buggy lint, fixed in nightly
std::thread::spawn(move || { std::thread::spawn(move || {
rt.block_on(axum::serve(listener, app).into_future()) rt.block_on(axum::serve(listener, app).into_future());
.unwrap();
}); });
let mut cmd = Command::new("rewrk"); let mut cmd = Command::new("rewrk");
+1 -1
View File
@@ -557,7 +557,7 @@ let app_with_middleware = middleware.layer(app);
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app_with_middleware.into_make_service()).await.unwrap(); axum::serve(listener, app_with_middleware.into_make_service()).await;
# }; # };
``` ```
+2 -2
View File
@@ -43,7 +43,7 @@ let app = Router::new().fallback(handler);
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
# }; # };
``` ```
@@ -56,6 +56,6 @@ async fn handler() {}
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, handler.into_make_service()).await.unwrap(); axum::serve(listener, handler.into_make_service()).await;
# }; # };
``` ```
@@ -22,7 +22,7 @@ async fn handler(ConnectInfo(addr): ConnectInfo<SocketAddr>) -> String {
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app.into_make_service_with_connect_info::<SocketAddr>()).await.unwrap(); axum::serve(listener, app.into_make_service_with_connect_info::<SocketAddr>()).await;
# }; # };
``` ```
@@ -60,7 +60,7 @@ impl Connected<IncomingStream<'_, TcpListener>> for MyConnectInfo {
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app.into_make_service_with_connect_info::<MyConnectInfo>()).await.unwrap(); axum::serve(listener, app.into_make_service_with_connect_info::<MyConnectInfo>()).await;
# }; # };
``` ```
@@ -27,7 +27,7 @@ async fn main() {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, router).await.unwrap(); axum::serve(listener, router).await;
} }
``` ```
+8 -8
View File
@@ -15,7 +15,7 @@ let routes = Router::new()
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, routes).await.unwrap(); axum::serve(listener, routes).await;
# }; # };
``` ```
@@ -41,7 +41,7 @@ let routes = routes().with_state(AppState {});
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, routes).await.unwrap(); axum::serve(listener, routes).await;
# }; # };
``` ```
@@ -64,7 +64,7 @@ let routes = routes(AppState {});
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, routes).await.unwrap(); axum::serve(listener, routes).await;
# }; # };
``` ```
@@ -91,7 +91,7 @@ let routes = Router::new().nest("/api", routes(AppState {}));
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, routes).await.unwrap(); axum::serve(listener, routes).await;
# }; # };
``` ```
@@ -124,7 +124,7 @@ let router: Router<()> = router.with_state(AppState {});
// because it is still missing an `AppState`. // because it is still missing an `AppState`.
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, router).await.unwrap(); axum::serve(listener, router).await;
# }; # };
``` ```
@@ -153,7 +153,7 @@ let final_router: Router<()> = string_router.with_state("foo".to_owned());
// Since we have a `Router<()>` we can run it. // Since we have a `Router<()>` we can run it.
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, final_router).await.unwrap(); axum::serve(listener, final_router).await;
# }; # };
``` ```
@@ -179,7 +179,7 @@ let app = routes(AppState {});
// but `app` is a `Router<AppState>` // but `app` is a `Router<AppState>`
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
# }; # };
``` ```
@@ -202,7 +202,7 @@ let app = routes(AppState {});
// We can now call `Router::into_make_service` // We can now call `Router::into_make_service`
# async { # async {
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
# }; # };
``` ```
+3 -6
View File
@@ -321,8 +321,7 @@ mod tests {
listener, listener,
app.into_make_service_with_connect_info::<SocketAddr>(), app.into_make_service_with_connect_info::<SocketAddr>(),
) )
.await .await;
.unwrap();
}); });
rx.await.unwrap(); rx.await.unwrap();
@@ -363,8 +362,7 @@ mod tests {
listener, listener,
app.into_make_service_with_connect_info::<MyConnectInfo>(), app.into_make_service_with_connect_info::<MyConnectInfo>(),
) )
.await .await;
.unwrap();
}); });
rx.await.unwrap(); rx.await.unwrap();
@@ -410,8 +408,7 @@ mod tests {
listener, listener,
app.into_make_service_with_connect_info::<SocketAddr>(), app.into_make_service_with_connect_info::<SocketAddr>(),
) )
.await .await;
.unwrap();
}); });
let client = reqwest::Client::new(); let client = reqwest::Client::new();
+1 -1
View File
@@ -157,7 +157,7 @@ use std::{
/// ///
/// # async { /// # async {
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, handler_with_state.into_make_service()).await.unwrap(); /// axum::serve(listener, handler_with_state.into_make_service()).await;
/// # }; /// # };
/// ``` /// ```
/// ///
+2 -2
View File
@@ -55,7 +55,7 @@ impl<H, T, S> HandlerService<H, T, S> {
/// ///
/// # async { /// # async {
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, app.into_make_service()).await.unwrap(); /// axum::serve(listener, app.into_make_service()).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -94,7 +94,7 @@ impl<H, T, S> HandlerService<H, T, S> {
/// axum::serve( /// axum::serve(
/// listener, /// listener,
/// app.into_make_service_with_connect_info::<SocketAddr>(), /// app.into_make_service_with_connect_info::<SocketAddr>(),
/// ).await.unwrap(); /// ).await;
/// # }; /// # };
/// ``` /// ```
/// ///
+1 -1
View File
@@ -37,7 +37,7 @@
//! //!
//! // run our app with hyper, listening globally on port 3000 //! // run our app with hyper, listening globally on port 3000
//! let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); //! let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
//! axum::serve(listener, app).await.unwrap(); //! axum::serve(listener, app).await;
//! } //! }
//! ``` //! ```
//! //!
+3 -3
View File
@@ -697,7 +697,7 @@ impl MethodRouter<(), Infallible> {
/// ///
/// # async { /// # async {
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, router.into_make_service()).await.unwrap(); /// axum::serve(listener, router.into_make_service()).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -729,7 +729,7 @@ impl MethodRouter<(), Infallible> {
/// ///
/// # async { /// # async {
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, router.into_make_service()).await.unwrap(); /// axum::serve(listener, router.into_make_service()).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -1451,7 +1451,7 @@ mod tests {
); );
let listener = tokio::net::TcpListener::bind("0.0.0.0:0").await.unwrap(); let listener = tokio::net::TcpListener::bind("0.0.0.0:0").await.unwrap();
crate::serve(listener, app).await.unwrap(); crate::serve(listener, app).await;
} }
#[crate::test] #[crate::test]
+1 -1
View File
@@ -532,7 +532,7 @@ impl Router {
/// ///
/// # async { /// # async {
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, app).await.unwrap(); /// axum::serve(listener, app).await;
/// # }; /// # };
/// ``` /// ```
/// ///
+1 -1
View File
@@ -110,7 +110,7 @@ pub trait ListenerExt: Listener + Sized {
/// trace!("failed to set TCP_NODELAY on incoming connection: {err:#}"); /// trace!("failed to set TCP_NODELAY on incoming connection: {err:#}");
/// } /// }
/// }); /// });
/// axum::serve(listener, router).await.unwrap(); /// axum::serve(listener, router).await;
/// # }; /// # };
/// ``` /// ```
fn tap_io<F>(self, tap_fn: F) -> TapIo<Self, F> fn tap_io<F>(self, tap_fn: F) -> TapIo<Self, F>
+15 -24
View File
@@ -44,7 +44,7 @@ pub use self::listener::{ConnLimiter, ConnLimiterIo, Listener, ListenerExt, TapI
/// let router = Router::new().route("/", get(|| async { "Hello, World!" })); /// let router = Router::new().route("/", get(|| async { "Hello, World!" }));
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, router).await.unwrap(); /// axum::serve(listener, router).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -59,7 +59,7 @@ pub use self::listener::{ConnLimiter, ConnLimiterIo, Listener, ListenerExt, TapI
/// let router = get(|| async { "Hello, World!" }); /// let router = get(|| async { "Hello, World!" });
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, router).await.unwrap(); /// axum::serve(listener, router).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -76,7 +76,7 @@ pub use self::listener::{ConnLimiter, ConnLimiterIo, Listener, ListenerExt, TapI
/// } /// }
/// ///
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, handler.into_make_service()).await.unwrap(); /// axum::serve(listener, handler.into_make_service()).await;
/// # }; /// # };
/// ``` /// ```
/// ///
@@ -142,8 +142,7 @@ where
/// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); /// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
/// axum::serve(listener, router) /// axum::serve(listener, router)
/// .with_graceful_shutdown(shutdown_signal()) /// .with_graceful_shutdown(shutdown_signal())
/// .await /// .await;
/// .unwrap();
/// # }; /// # };
/// ///
/// async fn shutdown_signal() { /// async fn shutdown_signal() {
@@ -237,7 +236,7 @@ where
B::Data: Send, B::Data: Send,
B::Error: Into<Box<dyn StdError + Send + Sync>>, B::Error: Into<Box<dyn StdError + Send + Sync>>,
{ {
type Output = io::Result<()>; type Output = Infallible;
type IntoFuture = private::ServeFuture; type IntoFuture = private::ServeFuture;
fn into_future(self) -> Self::IntoFuture { fn into_future(self) -> Self::IntoFuture {
@@ -358,14 +357,11 @@ where
B::Data: Send, B::Data: Send,
B::Error: Into<Box<dyn StdError + Send + Sync>>, B::Error: Into<Box<dyn StdError + Send + Sync>>,
{ {
type Output = io::Result<()>; type Output = ();
type IntoFuture = private::ServeFuture; type IntoFuture = private::ServeFuture<()>;
fn into_future(self) -> Self::IntoFuture { fn into_future(self) -> Self::IntoFuture {
private::ServeFuture(Box::pin(async move { private::ServeFuture(Box::pin(async move { self.run().await }))
self.run().await;
Ok(())
}))
} }
} }
@@ -473,16 +469,16 @@ where
mod private { mod private {
use std::{ use std::{
convert::Infallible,
future::Future, future::Future,
io,
pin::Pin, pin::Pin,
task::{Context, Poll}, task::{Context, Poll},
}; };
pub struct ServeFuture(pub(super) futures_core::future::BoxFuture<'static, io::Result<()>>); pub struct ServeFuture<T = Infallible>(pub(super) futures_core::future::BoxFuture<'static, T>);
impl Future for ServeFuture { impl<T> Future for ServeFuture<T> {
type Output = io::Result<()>; type Output = T;
#[inline] #[inline]
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
@@ -576,9 +572,7 @@ mod tests {
// router // router
serve(TcpListener::bind(addr).await.unwrap(), router.clone()); serve(TcpListener::bind(addr).await.unwrap(), router.clone());
serve(tcp_nodelay_listener().await, router.clone()) serve(tcp_nodelay_listener().await, router.clone()).await;
.await
.unwrap();
#[cfg(unix)] #[cfg(unix)]
serve(UnixListener::bind("").unwrap(), router.clone()); serve(UnixListener::bind("").unwrap(), router.clone());
@@ -733,8 +727,7 @@ mod tests {
let server_task = async { let server_task = async {
serve(ReadyListener(Some(server)), Router::new()) serve(ReadyListener(Some(server)), Router::new())
.with_graceful_shutdown(tokio::time::sleep(Duration::from_secs(1))) .with_graceful_shutdown(tokio::time::sleep(Duration::from_secs(1)))
.await .await;
.unwrap();
}; };
tokio::time::timeout(Duration::from_secs(timeout + 2), server_task) tokio::time::timeout(Duration::from_secs(timeout + 2), server_task)
@@ -754,9 +747,7 @@ mod tests {
client.write_all(req.as_bytes()).await.unwrap(); client.write_all(req.as_bytes()).await.unwrap();
let server_task = async { let server_task = async {
serve(ReadyListener(Some(server)), Router::new()) serve(ReadyListener(Some(server)), Router::new()).await;
.await
.unwrap();
}; };
let wait_for_server_to_close_conn = async { let wait_for_server_to_close_conn = async {
+1 -3
View File
@@ -21,9 +21,7 @@ where
println!("Listening on {addr}"); println!("Listening on {addr}");
tokio::spawn(async move { tokio::spawn(async move {
serve(listener, Shared::new(svc)) serve(listener, Shared::new(svc)).await;
.await
.expect("server error")
}); });
addr addr
+1 -1
View File
@@ -19,7 +19,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Result<(), AppError> { async fn handler() -> Result<(), AppError> {
+1 -1
View File
@@ -26,7 +26,7 @@ async fn main() {
// run it // run it
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Html<&'static str> { async fn handler() -> Html<&'static str> {
+1 -1
View File
@@ -56,7 +56,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn websocket_handler( async fn websocket_handler(
+1 -1
View File
@@ -23,7 +23,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
@@ -34,7 +34,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// middleware that shows how to consume the request body upfront // middleware that shows how to consume the request body upfront
+1 -1
View File
@@ -41,7 +41,7 @@ async fn main() {
async fn serve(app: Router, port: u16) { async fn serve(app: Router, port: u16) {
let addr = SocketAddr::from(([127, 0, 0, 1], port)); let addr = SocketAddr::from(([127, 0, 0, 1], port));
let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn html() -> impl IntoResponse { async fn html() -> impl IntoResponse {
@@ -32,5 +32,5 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
@@ -32,7 +32,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler(Path(params): Path<Params>) -> impl IntoResponse { async fn handler(Path(params): Path<Params>) -> impl IntoResponse {
+1 -1
View File
@@ -69,7 +69,7 @@ async fn main() {
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap(); let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
#[derive(Clone)] #[derive(Clone)]
+1 -1
View File
@@ -83,7 +83,7 @@ async fn main() {
let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {addr}"); tracing::debug!("listening on {addr}");
let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn create_user( async fn create_user(
+1 -1
View File
@@ -86,7 +86,7 @@ async fn main() {
let addr = SocketAddr::from(([127, 0, 0, 1], 3000)); let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {addr}"); tracing::debug!("listening on {addr}");
let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn create_user( async fn create_user(
+1 -1
View File
@@ -85,7 +85,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
#[derive(Default, Clone)] #[derive(Default, Clone)]
+1 -1
View File
@@ -26,7 +26,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
+1 -1
View File
@@ -33,7 +33,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Html<&'static str> { async fn handler() -> Html<&'static str> {
+1 -2
View File
@@ -48,8 +48,7 @@ async fn main() {
// Run the server with graceful shutdown // Run the server with graceful shutdown
axum::serve(listener, app) axum::serve(listener, app)
.with_graceful_shutdown(shutdown_signal()) .with_graceful_shutdown(shutdown_signal())
.await .await;
.unwrap();
} }
async fn shutdown_signal() { async fn shutdown_signal() {
+1 -1
View File
@@ -17,7 +17,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app()).await.unwrap(); axum::serve(listener, app()).await;
} }
// GET routes will also be called for HEAD requests but will have the response body removed. // GET routes will also be called for HEAD requests but will have the response body removed.
+1 -1
View File
@@ -16,7 +16,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Html<&'static str> { async fn handler() -> Html<&'static str> {
+1 -1
View File
@@ -73,7 +73,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn protected(claims: Claims) -> Result<String, AuthError> { async fn protected(claims: Claims) -> Result<String, AuthError> {
+1 -1
View File
@@ -78,7 +78,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
type SharedState = Arc<RwLock<AppState>>; type SharedState = Arc<RwLock<AppState>>;
+1 -1
View File
@@ -50,7 +50,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("Listening on {}", listener.local_addr().unwrap()); tracing::debug!("Listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app(client)).await.unwrap(); axum::serve(listener, app(client)).await;
} }
// defining routes and state // defining routes and state
+1 -1
View File
@@ -38,7 +38,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn show_form() -> Html<&'static str> { async fn show_form() -> Html<&'static str> {
+1 -1
View File
@@ -77,7 +77,7 @@ async fn main() {
.unwrap() .unwrap()
); );
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
#[derive(Clone)] #[derive(Clone)]
@@ -33,7 +33,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
+1 -1
View File
@@ -35,7 +35,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn print_request_response( async fn print_request_response(
+2 -2
View File
@@ -45,7 +45,7 @@ async fn start_main_server() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn start_metrics_server() { async fn start_metrics_server() {
@@ -56,7 +56,7 @@ async fn start_metrics_server() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
#[tokio::main] #[tokio::main]
+1 -1
View File
@@ -29,7 +29,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// basic handler that responds with a static string // basic handler that responds with a static string
+1 -1
View File
@@ -72,7 +72,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Html<&'static str> { async fn handler() -> Html<&'static str> {
+1 -1
View File
@@ -47,7 +47,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn stream_reqwest_response(State(client): State<Client>) -> Response { async fn stream_reqwest_response(State(client): State<Client>) -> Response {
+2 -2
View File
@@ -34,7 +34,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler(State(client): State<Client>, mut req: Request) -> Result<Response, StatusCode> { async fn handler(State(client): State<Client>, mut req: Request) -> Result<Response, StatusCode> {
@@ -63,5 +63,5 @@ async fn server() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
@@ -20,7 +20,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn root() -> Router { fn root() -> Router {
+1 -1
View File
@@ -57,7 +57,7 @@ async fn main() {
// run it with hyper // run it with hyper
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap(); let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// we can extract the connection pool with `State` // we can extract the connection pool with `State`
+2 -2
View File
@@ -39,7 +39,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
@@ -89,7 +89,7 @@ mod tests {
// Retrieve the port assigned to us by the OS // Retrieve the port assigned to us by the OS
let port = listener.local_addr().unwrap().port(); let port = listener.local_addr().unwrap().port();
tokio::spawn(async { tokio::spawn(async {
axum::serve(listener, app()).await.unwrap(); axum::serve(listener, app()).await;
}); });
// Returns address (e.g. http://127.0.0.1{random_port}) // Returns address (e.g. http://127.0.0.1{random_port})
format!("http://{host}:{port}") format!("http://{host}:{port}")
+1 -3
View File
@@ -111,7 +111,5 @@ async fn serve(app: Router, port: u16) {
let addr = SocketAddr::from(([127, 0, 0, 1], port)); let addr = SocketAddr::from(([127, 0, 0, 1], port));
let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app.layer(TraceLayer::new_for_http())) axum::serve(listener, app.layer(TraceLayer::new_for_http())).await;
.await
.unwrap();
} }
+1 -1
View File
@@ -43,7 +43,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// Handler that streams the request body to a file. // Handler that streams the request body to a file.
+1 -1
View File
@@ -44,7 +44,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler_home(State(state): State<Arc<AppState>>) -> Result<Html<String>, StatusCode> { async fn handler_home(State(state): State<Arc<AppState>>) -> Result<Html<String>, StatusCode> {
+1 -1
View File
@@ -32,7 +32,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
+1 -1
View File
@@ -21,7 +21,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
println!("listening on {}", listener.local_addr().unwrap()); println!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app()).await.unwrap(); axum::serve(listener, app()).await;
} }
fn app() -> Router { fn app() -> Router {
+2 -2
View File
@@ -29,7 +29,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app()).await.unwrap(); axum::serve(listener, app()).await;
} }
/// Having a function that produces our app makes it easy to call it from tests /// Having a function that produces our app makes it easy to call it from tests
@@ -132,7 +132,7 @@ mod tests {
let addr = listener.local_addr().unwrap(); let addr = listener.local_addr().unwrap();
tokio::spawn(async move { tokio::spawn(async move {
axum::serve(listener, app()).await.unwrap(); axum::serve(listener, app()).await;
}); });
let client = let client =
+1 -2
View File
@@ -133,6 +133,5 @@ where
tracing::debug!("listening on {addr}"); tracing::debug!("listening on {addr}");
axum::serve(listener, redirect.into_make_service()) axum::serve(listener, redirect.into_make_service())
.with_graceful_shutdown(signal) .with_graceful_shutdown(signal)
.await .await;
.unwrap();
} }
+1 -3
View File
@@ -97,7 +97,5 @@ async fn redirect_http_to_https(ports: Ports) {
let addr = SocketAddr::from(([127, 0, 0, 1], ports.http)); let addr = SocketAddr::from(([127, 0, 0, 1], ports.http));
let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); let listener = tokio::net::TcpListener::bind(addr).await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, redirect.into_make_service()) axum::serve(listener, redirect.into_make_service()).await;
.await
.unwrap();
} }
+1 -1
View File
@@ -72,7 +72,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
// The query parameters for todos index // The query parameters for todos index
+1 -1
View File
@@ -44,7 +44,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
type ConnectionPool = Pool<PostgresConnectionManager<NoTls>>; type ConnectionPool = Pool<PostgresConnectionManager<NoTls>>;
+1 -1
View File
@@ -49,7 +49,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
type ConnectionPool = bb8::Pool<redis::Client>; type ConnectionPool = bb8::Pool<redis::Client>;
+1 -1
View File
@@ -87,7 +87,7 @@ async fn main() {
// run it // run it
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap(); let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
async fn handler() -> Html<&'static str> { async fn handler() -> Html<&'static str> {
+1 -1
View File
@@ -52,7 +52,7 @@ mod unix {
.route("/", get(handler)) .route("/", get(handler))
.into_make_service_with_connect_info::<UdsConnectInfo>(); .into_make_service_with_connect_info::<UdsConnectInfo>();
axum::serve(uds, app).await.unwrap(); axum::serve(uds, app).await;
}); });
let stream = TokioIo::new(UnixStream::connect(path).await.unwrap()); let stream = TokioIo::new(UnixStream::connect(path).await.unwrap());
+1 -1
View File
@@ -39,7 +39,7 @@ async fn main() {
// run it // run it
let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap(); let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
+1 -1
View File
@@ -32,7 +32,7 @@ async fn main() {
.await .await
.unwrap(); .unwrap();
tracing::debug!("listening on {}", listener.local_addr().unwrap()); tracing::debug!("listening on {}", listener.local_addr().unwrap());
axum::serve(listener, app).await.unwrap(); axum::serve(listener, app).await;
} }
fn app() -> Router { fn app() -> Router {
+1 -2
View File
@@ -73,8 +73,7 @@ async fn main() {
listener, listener,
app.into_make_service_with_connect_info::<SocketAddr>(), app.into_make_service_with_connect_info::<SocketAddr>(),
) )
.await .await;
.unwrap();
} }
/// The handler for the HTTP request (this gets called when the HTTP request lands at the start /// The handler for the HTTP request (this gets called when the HTTP request lands at the start