mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-23 16:21:06 +01:00
enable scope middleware with generic res body. (#2492)
Co-authored-by: Rob Ede <robjtede@icloud.com>
This commit is contained in:
parent
6460e67f84
commit
069cf2da07
@ -13,6 +13,8 @@
|
||||
* Rename `Accept::{mime_preference => preference}`. [#2480]
|
||||
* Un-deprecate `App::data_factory`. [#2484]
|
||||
* `HttpRequest::url_for` no longer constructs URLs with query or fragment components. [#2430]
|
||||
* Remove `B` (body) type parameter on `App`. [#2493]
|
||||
* Add `B` (body) type parameter on `Scope`. [#2492]
|
||||
|
||||
### Fixed
|
||||
* Accept wildcard `*` items in `AcceptLanguage`. [#2480]
|
||||
@ -25,6 +27,8 @@
|
||||
[#2482]: https://github.com/actix/actix-web/pull/2482
|
||||
[#2484]: https://github.com/actix/actix-web/pull/2484
|
||||
[#2485]: https://github.com/actix/actix-web/pull/2485
|
||||
[#2492]: https://github.com/actix/actix-web/pull/2492
|
||||
[#2493]: https://github.com/actix/actix-web/pull/2493
|
||||
|
||||
|
||||
## 4.0.0-beta.13 - 2021-11-30
|
||||
|
@ -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))),
|
||||
),
|
||||
|
49
src/scope.rs
49
src/scope.rs
@ -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.
|
||||
///
|
||||
@ -295,32 +298,29 @@ where
|
||||
self
|
||||
}
|
||||
|
||||
/// Registers middleware, in the form of a middleware component (type),
|
||||
/// that runs during inbound processing in the request
|
||||
/// life-cycle (request -> response), modifying request as
|
||||
/// necessary, across all requests managed by the *Scope*. Scope-level
|
||||
/// middleware is more limited in what it can modify, relative to Route or
|
||||
/// Application level middleware, in that Scope-level middleware can not modify
|
||||
/// ServiceResponse.
|
||||
/// Registers middleware, in the form of a middleware component (type), that runs during inbound
|
||||
/// processing in the request life-cycle (request -> response), modifying request as necessary,
|
||||
/// across all requests managed by the *Scope*.
|
||||
///
|
||||
/// 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,16 +334,15 @@ where
|
||||
default: self.default,
|
||||
external: self.external,
|
||||
factory_ref: self.factory_ref,
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
|
||||
/// Registers middleware, in the form of a closure, that runs during inbound
|
||||
/// processing in the request life-cycle (request -> response), modifying
|
||||
/// request as necessary, across all requests managed by the *Scope*.
|
||||
/// Scope-level middleware is more limited in what it can modify, relative
|
||||
/// to Route or Application level middleware, in that Scope-level middleware
|
||||
/// can not modify ServiceResponse.
|
||||
/// Registers middleware, in the form of a closure, that runs during inbound processing in the
|
||||
/// request life-cycle (request -> response), modifying request as necessary, across all
|
||||
/// requests managed by the *Scope*.
|
||||
///
|
||||
/// # Examples
|
||||
/// ```
|
||||
/// use actix_service::Service;
|
||||
/// use actix_web::{web, App};
|
||||
@ -369,21 +368,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 +394,7 @@ where
|
||||
default: self.default,
|
||||
external: self.external,
|
||||
factory_ref: self.factory_ref,
|
||||
_phantom: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user