enable scope middleware with generic res body.

This commit is contained in:
fakeshadow 2021-12-07 17:03:46 +08:00
parent 606a371ec3
commit f28fa21ebc
2 changed files with 19 additions and 12 deletions

View File

@ -154,7 +154,7 @@ mod tests {
let srv = init_service(
App::new().service(
web::scope("app")
.wrap(Compat::new(logger))
.wrap(logger)
.wrap(Compat::new(compress))
.service(web::resource("/test").route(web::get().to(HttpResponse::Ok))),
),

View File

@ -1,6 +1,6 @@
use std::{cell::RefCell, fmt, future::Future, mem, rc::Rc};
use std::{cell::RefCell, fmt, future::Future, marker::PhantomData, mem, rc::Rc};
use actix_http::Extensions;
use actix_http::{body::BoxBody, Extensions};
use actix_router::{ResourceDef, Router};
use actix_service::{
apply, apply_fn_factory, boxed, IntoServiceFactory, Service, ServiceFactory,
@ -52,7 +52,7 @@ type Guards = Vec<Box<dyn Guard>>;
/// * /{project_id}/path1 - responds to all http method
/// * /{project_id}/path2 - `GET` requests
/// * /{project_id}/path3 - `HEAD` requests
pub struct Scope<T = ScopeEndpoint> {
pub struct Scope<T = ScopeEndpoint, B = BoxBody> {
endpoint: T,
rdef: String,
app_data: Option<Extensions>,
@ -61,6 +61,7 @@ pub struct Scope<T = ScopeEndpoint> {
default: Option<Rc<BoxedHttpServiceFactory>>,
external: Vec<ResourceDef>,
factory_ref: Rc<RefCell<Option<ScopeFactory>>>,
_phantom: PhantomData<B>,
}
impl Scope {
@ -77,19 +78,21 @@ impl Scope {
default: None,
external: Vec::new(),
factory_ref,
_phantom: Default::default(),
}
}
}
impl<T> Scope<T>
impl<T, B> Scope<T, B>
where
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse,
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
B: 'static,
{
/// Add match guard to a scope.
///
@ -304,23 +307,24 @@ where
/// ServiceResponse.
///
/// Use middleware when you need to read or modify *every* request in some way.
pub fn wrap<M>(
pub fn wrap<M, B1>(
self,
mw: M,
) -> Scope<
impl ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse,
Response = ServiceResponse<B1>,
Error = Error,
InitError = (),
>,
B1,
>
where
M: Transform<
T::Service,
ServiceRequest,
Response = ServiceResponse,
Response = ServiceResponse<B1>,
Error = Error,
InitError = (),
>,
@ -334,6 +338,7 @@ where
default: self.default,
external: self.external,
factory_ref: self.factory_ref,
_phantom: PhantomData,
}
}
@ -369,21 +374,22 @@ where
/// .route("/index.html", web::get().to(index)));
/// }
/// ```
pub fn wrap_fn<F, R>(
pub fn wrap_fn<F, R, B1>(
self,
mw: F,
) -> Scope<
impl ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse,
Response = ServiceResponse<B1>,
Error = Error,
InitError = (),
>,
B1,
>
where
F: Fn(ServiceRequest, &T::Service) -> R + Clone,
R: Future<Output = Result<ServiceResponse, Error>>,
R: Future<Output = Result<ServiceResponse<B1>, Error>>,
{
Scope {
endpoint: apply_fn_factory(self.endpoint, mw),
@ -394,6 +400,7 @@ where
default: self.default,
external: self.external,
factory_ref: self.factory_ref,
_phantom: PhantomData,
}
}
}