From a4aff9cef6d1ce32dff6d9fb69c06bea5c42a08d Mon Sep 17 00:00:00 2001 From: David Pedersen Date: Mon, 1 Jan 2024 14:19:50 +0100 Subject: [PATCH] use hyper_util::service::TowerToHyperService --- axum/Cargo.toml | 2 +- axum/src/serve.rs | 55 ++++------------------------------------------- 2 files changed, 5 insertions(+), 52 deletions(-) diff --git a/axum/Cargo.toml b/axum/Cargo.toml index 18893f4f..1e188dce 100644 --- a/axum/Cargo.toml +++ b/axum/Cargo.toml @@ -64,7 +64,7 @@ tower-service = "0.3" axum-macros = { path = "../axum-macros", version = "0.4.0", optional = true } base64 = { version = "0.21.0", optional = true } hyper = { version = "1.1.0", optional = true } -hyper-util = { version = "0.1.2", features = ["tokio", "server", "server-auto"], optional = true } +hyper-util = { version = "0.1.2", features = ["tokio", "server", "server-auto", "service"], optional = true } multer = { version = "3.0.0", optional = true } serde_json = { version = "1.0", features = ["raw_value"], optional = true } serde_path_to_error = { version = "0.1.8", optional = true } diff --git a/axum/src/serve.rs b/axum/src/serve.rs index 8808ffc5..b5c68571 100644 --- a/axum/src/serve.rs +++ b/axum/src/serve.rs @@ -7,9 +7,7 @@ use std::{ io, marker::PhantomData, net::SocketAddr, - pin::Pin, sync::Arc, - task::{Context, Poll}, time::Duration, }; @@ -20,12 +18,11 @@ use hyper_util::{ rt::{TokioExecutor, TokioIo}, server::conn::auto::Builder, }; -use pin_project_lite::pin_project; use tokio::{ net::{TcpListener, TcpStream}, sync::watch, }; -use tower::util::{Oneshot, ServiceExt}; +use tower::util::ServiceExt; use tower_service::Service; /// Serve the service with the supplied listener. @@ -283,11 +280,10 @@ where remote_addr, }) .await - .unwrap_or_else(|err| match err {}); + .unwrap_or_else(|err| match err {}) + .map_request(|req: Request| req.map(Body::new)); - let hyper_service = TowerToHyperService { - service: tower_service, - }; + let hyper_service = hyper_util::service::TowerToHyperService::new(tower_service); let signal_tx = Arc::clone(&signal_tx); @@ -397,49 +393,6 @@ mod private { } } -#[derive(Debug, Copy, Clone)] -struct TowerToHyperService { - service: S, -} - -impl hyper::service::Service> for TowerToHyperService -where - S: tower_service::Service + Clone, -{ - type Response = S::Response; - type Error = S::Error; - type Future = TowerToHyperServiceFuture; - - fn call(&self, req: Request) -> Self::Future { - let req = req.map(Body::new); - TowerToHyperServiceFuture { - future: self.service.clone().oneshot(req), - } - } -} - -pin_project! { - struct TowerToHyperServiceFuture - where - S: tower_service::Service, - { - #[pin] - future: Oneshot, - } -} - -impl Future for TowerToHyperServiceFuture -where - S: tower_service::Service, -{ - type Output = Result; - - #[inline] - fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { - self.project().future.poll(cx) - } -} - /// An incoming stream. /// /// Used with [`serve`] and [`IntoMakeServiceWithConnectInfo`].