rename to compat

This commit is contained in:
fakeshadow 2021-01-04 20:31:56 +08:00
parent 6c691df9ad
commit a4c389b80d
4 changed files with 23 additions and 27 deletions

View File

@ -2,7 +2,7 @@
## Unreleased - 2021-xx-xx ## Unreleased - 2021-xx-xx
### Added ### Added
* `Scoped` middleware enabling generic response body/error type of middlewares * `Compat` middleware enabling generic response body/error type of middlewares
like `Logger` and `Compress` to be used in `middleware::Condition` like `Logger` and `Compress` to be used in `middleware::Condition`
and `Resource`, `Scope` services. [#1865] and `Resource`, `Scope` services. [#1865]

View File

@ -18,30 +18,28 @@ use crate::service::ServiceResponse;
/// ## Usage /// ## Usage
/// ///
/// ```rust /// ```rust
/// use actix_web::middleware::{Logger, Scoped}; /// use actix_web::middleware::{Logger, Compat};
/// use actix_web::{App, web}; /// use actix_web::{App, web};
/// ///
/// # fn main() {
/// let logger = Logger::default(); /// let logger = Logger::default();
/// ///
/// // this would not compile /// // this would not compile
/// // let app = App::new().service(web::scope("scoped").wrap(logger)); /// // let app = App::new().service(web::scope("scoped").wrap(logger));
/// ///
/// // by using scoped middleware we can use logger in scope. /// // by using scoped middleware we can use logger in scope.
/// let app = App::new().service(web::scope("scoped").wrap(Scoped::new(logger))); /// let app = App::new().service(web::scope("scoped").wrap(Compat::new(logger)));
/// # }
/// ``` /// ```
pub struct Scoped<T> { pub struct Compat<T> {
transform: T, transform: T,
} }
impl<T> Scoped<T> { impl<T> Compat<T> {
pub fn new(transform: T) -> Self { pub fn new(transform: T) -> Self {
Self { transform } Self { transform }
} }
} }
impl<S, T, Req> Transform<S, Req> for Scoped<T> impl<S, T, Req> Transform<S, Req> for Compat<T>
where where
S: Service<Req>, S: Service<Req>,
T: Transform<S, Req>, T: Transform<S, Req>,
@ -51,7 +49,7 @@ where
{ {
type Response = ServiceResponse; type Response = ServiceResponse;
type Error = Error; type Error = Error;
type Transform = ScopedMiddleware<T::Transform>; type Transform = CompatMiddleware<T::Transform>;
type InitError = T::InitError; type InitError = T::InitError;
type Future = LocalBoxFuture<'static, Result<Self::Transform, Self::InitError>>; type Future = LocalBoxFuture<'static, Result<Self::Transform, Self::InitError>>;
@ -59,16 +57,16 @@ where
let fut = self.transform.new_transform(service); let fut = self.transform.new_transform(service);
Box::pin(async move { Box::pin(async move {
let service = fut.await?; let service = fut.await?;
Ok(ScopedMiddleware { service }) Ok(CompatMiddleware { service })
}) })
} }
} }
pub struct ScopedMiddleware<S> { pub struct CompatMiddleware<S> {
service: S, service: S,
} }
impl<S, Req> Service<Req> for ScopedMiddleware<S> impl<S, Req> Service<Req> for CompatMiddleware<S>
where where
S: Service<Req>, S: Service<Req>,
S::Response: MapServiceResponseBody, S::Response: MapServiceResponseBody,
@ -76,7 +74,7 @@ where
{ {
type Response = ServiceResponse; type Response = ServiceResponse;
type Error = Error; type Error = Error;
type Future = ScopedFuture<S::Future>; type Future = CompatMiddlewareFuture<S::Future>;
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
self.service.poll_ready(cx).map_err(From::from) self.service.poll_ready(cx).map_err(From::from)
@ -84,18 +82,17 @@ where
fn call(&mut self, req: Req) -> Self::Future { fn call(&mut self, req: Req) -> Self::Future {
let fut = self.service.call(req); let fut = self.service.call(req);
ScopedFuture { fut } CompatMiddlewareFuture { fut }
} }
} }
#[doc(hidden)]
#[pin_project::pin_project] #[pin_project::pin_project]
pub struct ScopedFuture<Fut> { pub struct CompatMiddlewareFuture<Fut> {
#[pin] #[pin]
fut: Fut, fut: Fut,
} }
impl<Fut, T, E> Future for ScopedFuture<Fut> impl<Fut, T, E> Future for CompatMiddlewareFuture<Fut>
where where
Fut: Future<Output = Result<T, E>>, Fut: Future<Output = Result<T, E>>,
T: MapServiceResponseBody, T: MapServiceResponseBody,
@ -109,9 +106,8 @@ where
} }
} }
// private trait for convert ServiceResponse's ResponseBody<B> generic type // trait for convert ServiceResponse's ResponseBody<B> generic type
// to ResponseBody<Body> // to ResponseBody<Body>
#[doc(hidden)]
pub trait MapServiceResponseBody { pub trait MapServiceResponseBody {
fn map_body(self) -> ServiceResponse; fn map_body(self) -> ServiceResponse;
} }
@ -142,8 +138,8 @@ mod tests {
let mut srv = init_service( let mut srv = init_service(
App::new().service( App::new().service(
web::scope("app") web::scope("app")
.wrap(Scoped::new(logger)) .wrap(Compat::new(logger))
.wrap(Scoped::new(compress)) .wrap(Compat::new(compress))
.service( .service(
web::resource("/test").route(web::get().to(HttpResponse::Ok)), web::resource("/test").route(web::get().to(HttpResponse::Ok)),
), ),
@ -164,8 +160,8 @@ mod tests {
let mut srv = init_service( let mut srv = init_service(
App::new().service( App::new().service(
web::resource("app/test") web::resource("app/test")
.wrap(Scoped::new(logger)) .wrap(Compat::new(logger))
.wrap(Scoped::new(compress)) .wrap(Compat::new(compress))
.route(web::get().to(HttpResponse::Ok)), .route(web::get().to(HttpResponse::Ok)),
), ),
) )
@ -186,7 +182,7 @@ mod tests {
let logger = Logger::default(); let logger = Logger::default();
let mut mw = Condition::new(true, Scoped::new(logger)) let mut mw = Condition::new(true, Compat::new(logger))
.new_transform(srv.into_service()) .new_transform(srv.into_service())
.await .await
.unwrap(); .unwrap();

View File

@ -8,7 +8,7 @@ use futures_util::future::{ok, Either, FutureExt, LocalBoxFuture};
/// The controlled middleware must not change the `Service` interfaces. /// The controlled middleware must not change the `Service` interfaces.
/// ///
/// This means you cannot control such middlewares like `Logger` or `Compress` directly. /// This means you cannot control such middlewares like `Logger` or `Compress` directly.
/// *. See `Scoped` middleware for alternative. /// *. See `Compat` middleware for alternative.
/// ///
/// ## Usage /// ## Usage
/// ///

View File

@ -5,15 +5,15 @@ mod compress;
#[cfg(feature = "compress")] #[cfg(feature = "compress")]
pub use self::compress::Compress; pub use self::compress::Compress;
mod compat;
mod condition; mod condition;
mod defaultheaders; mod defaultheaders;
pub mod errhandlers; pub mod errhandlers;
mod logger; mod logger;
pub mod normalize; pub mod normalize;
mod scoped;
pub use self::compat::Compat;
pub use self::condition::Condition; pub use self::condition::Condition;
pub use self::defaultheaders::DefaultHeaders; pub use self::defaultheaders::DefaultHeaders;
pub use self::logger::Logger; pub use self::logger::Logger;
pub use self::normalize::NormalizePath; pub use self::normalize::NormalizePath;
pub use self::scoped::Scoped;