mirror of https://github.com/fafhrd91/actix-web
rename to compat
This commit is contained in:
parent
6c691df9ad
commit
a4c389b80d
|
@ -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]
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
@ -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
|
||||||
///
|
///
|
||||||
|
|
|
@ -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;
|
|
||||||
|
|
Loading…
Reference in New Issue