From 4ca774245c910f34dfc92cb97322ee1a6f6791b6 Mon Sep 17 00:00:00 2001 From: tottoto Date: Fri, 23 Aug 2024 20:58:31 +0900 Subject: [PATCH] Use upstream hyper_util::service::TowerToHyperService --- Cargo.toml | 10 +++++---- src/server.rs | 2 +- src/service.rs | 56 -------------------------------------------------- 3 files changed, 7 insertions(+), 61 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 594dab93..a9e5e85d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,8 +15,8 @@ rust-version = "1.66" [features] default = [] tls-rustls = ["tls-rustls-no-provider", "rustls/aws-lc-rs"] -tls-rustls-no-provider = ["arc-swap", "rustls", "rustls-pemfile", "tokio/fs", "tokio/time", "tokio-rustls", "rustls-pki-types"] -tls-openssl = ["arc-swap", "openssl", "tokio-openssl"] +tls-rustls-no-provider = ["arc-swap", "rustls", "rustls-pemfile", "tokio/fs", "tokio/time", "tokio-rustls", "rustls-pki-types", "dep:pin-project-lite"] +tls-openssl = ["arc-swap", "openssl", "tokio-openssl", "dep:pin-project-lite"] [dependencies] bytes = "1" @@ -29,8 +29,7 @@ hyper = { version = "1.4", features = ["http1", "http2", "server"] } tokio = { version = "1", features = ["macros", "net", "sync"] } tower-service = "0.3" http-body-util = "0.1" -hyper-util = { version = "0.1.2", features = ["server-auto", "tokio"] } -pin-project-lite = "0.2" +hyper-util = { version = "0.1.2", features = ["server-auto", "service", "tokio"] } tower = { version = "0.5", features = ["util"] } # optional dependencies @@ -45,6 +44,9 @@ tokio-rustls = { version = "0.26", default-features = false, optional = true } openssl = { version = "0.10", optional = true } tokio-openssl = { version = "0.6", optional = true } +## rustls or openssl +pin-project-lite = { version = "0.2", optional = true } + [dev-dependencies] serial_test = "3.1" axum = "0.7" diff --git a/src/server.rs b/src/server.rs index c531b5b2..3054e0df 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,7 +1,6 @@ use crate::{ accept::{Accept, DefaultAcceptor}, handle::Handle, - service::TowerToHyperService, service::{MakeService, SendService}, }; use futures_util::future::poll_fn; @@ -10,6 +9,7 @@ use hyper::body::Incoming; use hyper_util::{ rt::{TokioExecutor, TokioIo}, server::conn::auto::Builder, + service::TowerToHyperService, }; use std::{ fmt, diff --git a/src/service.rs b/src/service.rs index 403f2a62..644415c6 100644 --- a/src/service.rs +++ b/src/service.rs @@ -2,13 +2,10 @@ use http::Response; use http_body::Body; -use pin_project_lite::pin_project; use std::{ future::Future, - pin::Pin, task::{Context, Poll}, }; -use tower::{util::Oneshot, ServiceExt}; use tower_service::Service; /// Trait alias for [`Service`] with bounds required for [`serve`](crate::server::Server::serve). @@ -160,56 +157,3 @@ mod send_service { mod make_service_ref { pub trait Sealed {} } - -/// A tower service converted into a hyper service. -#[derive(Debug, Copy, Clone)] -pub(crate) struct TowerToHyperService { - service: S, -} - -impl TowerToHyperService { - /// Create a new `TowerToHyperService` from a tower service. - pub(crate) fn new(tower_service: S) -> Self { - Self { - service: tower_service, - } - } -} - -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: R) -> Self::Future { - TowerToHyperServiceFuture { - future: self.service.clone().oneshot(req), - } - } -} - -pin_project! { - /// Response future for [`TowerToHyperService`]. - pub 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) - } -}