@@ -26,18 +26,31 @@ use crate::{
26
26
/// let app = App::new()
27
27
/// .wrap(Condition::new(enable_normalize, NormalizePath::default()));
28
28
/// ```
29
+ /// Or you can use an `Option` to create a new instance:
30
+ /// ```
31
+ /// use actix_web::middleware::{Condition, NormalizePath};
32
+ /// use actix_web::App;
33
+ ///
34
+ /// let app = App::new()
35
+ /// .wrap(Condition::from_option(Some(NormalizePath::default())));
36
+ /// ```
29
37
pub struct Condition < T > {
30
- transformer : T ,
31
- enable : bool ,
38
+ transformer : Option < T > ,
32
39
}
33
40
34
41
impl < T > Condition < T > {
35
42
pub fn new ( enable : bool , transformer : T ) -> Self {
36
43
Self {
37
- transformer,
38
- enable,
44
+ transformer : match enable {
45
+ true => Some ( transformer) ,
46
+ false => None ,
47
+ } ,
39
48
}
40
49
}
50
+
51
+ pub fn from_option ( transformer : Option < T > ) -> Self {
52
+ Self { transformer }
53
+ }
41
54
}
42
55
43
56
impl < S , T , Req , BE , BD , Err > Transform < S , Req > for Condition < T >
55
68
type Future = LocalBoxFuture < ' static , Result < Self :: Transform , Self :: InitError > > ;
56
69
57
70
fn new_transform ( & self , service : S ) -> Self :: Future {
58
- if self . enable {
59
- let fut = self . transformer . new_transform ( service) ;
71
+ if let Some ( transformer ) = & self . transformer {
72
+ let fut = transformer. new_transform ( service) ;
60
73
async move {
61
74
let wrapped_svc = fut. await ?;
62
75
Ok ( ConditionMiddleware :: Enable ( wrapped_svc) )
@@ -131,6 +144,7 @@ where
131
144
#[ cfg( test) ]
132
145
mod tests {
133
146
use actix_service:: IntoService as _;
147
+ use futures_util:: future:: ok;
134
148
135
149
use super :: * ;
136
150
use crate :: {
@@ -167,6 +181,18 @@ mod tests {
167
181
let _ = Condition :: new ( true , middleware:: ErrorHandlers :: < Bytes > :: new ( ) ) ;
168
182
}
169
183
184
+ fn create_optional_mw < B > ( enabled : bool ) -> Option < ErrorHandlers < B > >
185
+ where
186
+ B : ' static ,
187
+ {
188
+ match enabled {
189
+ true => Some (
190
+ ErrorHandlers :: new ( ) . handler ( StatusCode :: INTERNAL_SERVER_ERROR , render_500) ,
191
+ ) ,
192
+ false => None ,
193
+ }
194
+ }
195
+
170
196
#[ actix_rt:: test]
171
197
async fn test_handler_enabled ( ) {
172
198
let srv = |req : ServiceRequest | async move {
@@ -204,4 +230,33 @@ mod tests {
204
230
test:: call_service ( & mw, TestRequest :: default ( ) . to_srv_request ( ) ) . await ;
205
231
assert_eq ! ( resp. headers( ) . get( CONTENT_TYPE ) , None ) ;
206
232
}
233
+
234
+ #[ actix_rt:: test]
235
+ async fn test_handler_some ( ) {
236
+ let srv = |req : ServiceRequest | {
237
+ ok ( req. into_response ( HttpResponse :: InternalServerError ( ) . finish ( ) ) )
238
+ } ;
239
+
240
+ let mw = Condition :: from_option ( create_optional_mw ( true ) )
241
+ . new_transform ( srv. into_service ( ) )
242
+ . await
243
+ . unwrap ( ) ;
244
+ let resp = test:: call_service ( & mw, TestRequest :: default ( ) . to_srv_request ( ) ) . await ;
245
+ assert_eq ! ( resp. headers( ) . get( CONTENT_TYPE ) . unwrap( ) , "0001" ) ;
246
+ }
247
+
248
+ #[ actix_rt:: test]
249
+ async fn test_handler_none ( ) {
250
+ let srv = |req : ServiceRequest | {
251
+ ok ( req. into_response ( HttpResponse :: InternalServerError ( ) . finish ( ) ) )
252
+ } ;
253
+
254
+ let mw = Condition :: from_option ( create_optional_mw ( false ) )
255
+ . new_transform ( srv. into_service ( ) )
256
+ . await
257
+ . unwrap ( ) ;
258
+
259
+ let resp = test:: call_service ( & mw, TestRequest :: default ( ) . to_srv_request ( ) ) . await ;
260
+ assert_eq ! ( resp. headers( ) . get( CONTENT_TYPE ) , None ) ;
261
+ }
207
262
}
0 commit comments