From 89202ac37955588396fb9e42d1ec2615366d689e Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Sun, 9 Jun 2024 20:18:03 +0200 Subject: [PATCH] Replace own TowerToHyperService with upstream version (#2692) --- axum/Cargo.toml | 2 +- axum/src/serve.rs | 64 ++++++----------------------------------------- 2 files changed, 9 insertions(+), 57 deletions(-) diff --git a/axum/Cargo.toml b/axum/Cargo.toml index dd2a59da..013754f7 100644 --- a/axum/Cargo.toml +++ b/axum/Cargo.toml @@ -65,7 +65,7 @@ tower-service = "0.3" axum-macros = { path = "../axum-macros", version = "0.4.1", optional = true } base64 = { version = "0.21.0", optional = true } hyper = { version = "1.1.0", optional = true } -hyper-util = { version = "0.1.3", features = ["tokio", "server"], optional = true } +hyper-util = { version = "0.1.3", features = ["tokio", "server", "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 c5c54086..e23e6109 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, }; @@ -18,13 +16,12 @@ use futures_util::{pin_mut, FutureExt}; use hyper::body::Incoming; use hyper_util::rt::{TokioExecutor, TokioIo}; #[cfg(any(feature = "http1", feature = "http2"))] -use hyper_util::server::conn::auto::Builder; -use pin_project_lite::pin_project; +use hyper_util::{server::conn::auto::Builder, service::TowerToHyperService}; use tokio::{ net::{TcpListener, TcpStream}, sync::watch, }; -use tower::util::{Oneshot, ServiceExt}; +use tower::ServiceExt as _; use tower_service::Service; /// Serve the service with the supplied listener. @@ -243,11 +240,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 = TowerToHyperService::new(tower_service); tokio::spawn(async move { match Builder::new(TokioExecutor::new()) @@ -404,11 +400,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 = TowerToHyperService::new(tower_service); let signal_tx = Arc::clone(&signal_tx); @@ -518,49 +513,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`].