diff --git a/src/middleware/compat.rs b/src/middleware/compat.rs index 0e3a4f2b7..c57873c47 100644 --- a/src/middleware/compat.rs +++ b/src/middleware/compat.rs @@ -8,7 +8,7 @@ use std::{ use actix_http::body::{Body, MessageBody, ResponseBody}; use actix_service::{Service, Transform}; -use futures_core::{future::LocalBoxFuture, ready}; +use futures_core::ready; use crate::{error::Error, service::ServiceResponse}; @@ -55,14 +55,30 @@ where type Error = Error; type Transform = CompatMiddleware; type InitError = T::InitError; - type Future = LocalBoxFuture<'static, Result>; + type Future = CompatFut; fn new_transform(&self, service: S) -> Self::Future { - let fut = self.transform.new_transform(service); - Box::pin(async move { - let service = fut.await?; - Ok(CompatMiddleware { service }) - }) + CompatFut { + fut: self.transform.new_transform(service), + } + } +} + +#[pin_project::pin_project] +pub struct CompatFut { + #[pin] + fut: F, +} + +impl Future for CompatFut +where + F: Future>, +{ + type Output = Result, TE>; + + fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll { + let service = ready!(self.project().fut.poll(cx))?; + Poll::Ready(Ok(CompatMiddleware { service })) } }