@@ -47,6 +47,7 @@ pub struct Action {
4747pub struct RuleTrace {
4848 id : String ,
4949 on_response_status_codes : Vec < u16 > ,
50+ exclude_response_status_codes : bool ,
5051}
5152
5253#[ derive( Serialize , Deserialize , Debug , Clone , Default ) ]
@@ -146,13 +147,15 @@ impl WithTargetUnitTrace {
146147struct HeaderFilterAction {
147148 filter : HeaderFilter ,
148149 on_response_status_codes : Vec < u16 > ,
150+ exclude_response_status_codes : bool ,
149151 rule_id : Option < String > ,
150152}
151153
152154#[ derive( Serialize , Deserialize , Debug , Clone ) ]
153155struct BodyFilterAction {
154156 filter : BodyFilter ,
155157 on_response_status_codes : Vec < u16 > ,
158+ exclude_response_status_codes : bool ,
156159 rule_id : Option < String > ,
157160}
158161
@@ -230,6 +233,7 @@ impl Action {
230233 redirect_code => Some ( StatusCodeUpdate {
231234 status_code : redirect_code,
232235 on_response_status_codes : on_response_status_codes. clone ( ) ,
236+ exclude_response_status_codes : rule. source . exclude_response_status_codes . is_some ( ) ,
233237 fallback_status_code : 0 ,
234238 rule_id : Some ( rule. id . clone ( ) ) ,
235239 fallback_rule_id : None ,
@@ -267,6 +271,7 @@ impl Action {
267271 None => Vec :: new ( ) ,
268272 Some ( on_response) => on_response. clone ( ) ,
269273 } ,
274+ exclude_response_status_codes : rule. source . exclude_response_status_codes . is_some ( ) ,
270275 rule_id : Some ( rule. id . clone ( ) ) ,
271276 } )
272277 }
@@ -283,6 +288,7 @@ impl Action {
283288 target_hash : filter. target_hash . clone ( ) ,
284289 } ,
285290 on_response_status_codes : on_response_status_codes. clone ( ) ,
291+ exclude_response_status_codes : rule. source . exclude_response_status_codes . is_some ( ) ,
286292 rule_id : Some ( rule. id . clone ( ) ) ,
287293 } ) ;
288294 }
@@ -315,6 +321,7 @@ impl Action {
315321 } ) ,
316322 } ,
317323 on_response_status_codes : on_response_status_codes. clone ( ) ,
324+ exclude_response_status_codes : rule. source . exclude_response_status_codes . is_some ( ) ,
318325 rule_id : Some ( rule. id . clone ( ) ) ,
319326 } ) ;
320327 }
@@ -327,13 +334,15 @@ impl Action {
327334 rule_ids : vec ! [ rule. id. clone( ) ] ,
328335 rule_traces : Some ( vec ! [ RuleTrace {
329336 on_response_status_codes: on_response_status_codes. clone( ) ,
337+ exclude_response_status_codes: rule. source. exclude_response_status_codes. is_some( ) ,
330338 id: rule. id. clone( ) ,
331339 } ] ) ,
332340 rules_applied : Some ( LinkedHashSet :: new ( ) ) ,
333341 log_override : rule. log_override . map ( |log_override| LogOverride {
334342 log_override,
335343 rule_id : Some ( rule. id . clone ( ) ) ,
336344 on_response_status_codes : on_response_status_codes. clone ( ) ,
345+ exclude_response_status_codes : rule. source . exclude_response_status_codes . is_some ( ) ,
337346 fallback_log_override : None ,
338347 fallback_rule_id : None ,
339348 unit_id : rule. configuration_log_unit_id . clone ( ) ,
@@ -363,6 +372,7 @@ impl Action {
363372 Some ( StatusCodeUpdate {
364373 status_code : new_status_code_update. status_code ,
365374 on_response_status_codes : new_status_code_update. on_response_status_codes ,
375+ exclude_response_status_codes : new_status_code_update. exclude_response_status_codes ,
366376 fallback_status_code : old_status_code_update. status_code ,
367377 rule_id : new_status_code_update. rule_id ,
368378 target_hash : new_status_code_update. target_hash ,
@@ -404,6 +414,7 @@ impl Action {
404414 log_override : other_log_override. log_override ,
405415 rule_id : other_log_override. rule_id ,
406416 on_response_status_codes : other_log_override. on_response_status_codes ,
417+ exclude_response_status_codes : other_log_override. exclude_response_status_codes ,
407418 fallback_log_override : Some ( self_log_override. log_override ) ,
408419 fallback_rule_id : self_log_override. rule_id . clone ( ) ,
409420 unit_id : self_log_override. unit_id . clone ( ) ,
@@ -482,15 +493,31 @@ impl Action {
482493
483494 if let Some ( self_rule_traces) = self . rule_traces . clone ( ) {
484495 for trace in self_rule_traces {
485- if trace. on_response_status_codes . iter ( ) . all ( |v| * v == response_status_code ) {
496+ if trace. on_response_status_codes . is_empty ( ) {
486497 self . apply_rule_id ( Some ( trace. id ) ) ;
498+ continue ;
499+ }
500+
501+ if !trace. exclude_response_status_codes && trace. on_response_status_codes . iter ( ) . any ( |v| * v != response_status_code) {
502+ self . apply_rule_id ( Some ( trace. id ) ) ;
503+ continue ;
504+ }
505+
506+ if trace. exclude_response_status_codes && !trace. on_response_status_codes . contains ( & response_status_code) {
507+ self . apply_rule_id ( Some ( trace. id ) ) ;
487508 }
488509 }
489510 }
490511
491512 for filter in self . header_filters . clone ( ) {
492- if !filter. on_response_status_codes . is_empty ( ) && filter. on_response_status_codes . iter ( ) . all ( |v| * v != response_status_code) {
493- continue ;
513+ if !filter. on_response_status_codes . is_empty ( ) {
514+ if !filter. exclude_response_status_codes && filter. on_response_status_codes . iter ( ) . all ( |v| * v != response_status_code) {
515+ continue ;
516+ }
517+
518+ if filter. exclude_response_status_codes && filter. on_response_status_codes . contains ( & response_status_code) {
519+ continue ;
520+ }
494521 }
495522
496523 filters. push ( filter. filter ) ;
@@ -522,8 +549,14 @@ impl Action {
522549 let rule_applied = self . rule_traces . is_some ( ) ;
523550
524551 for filter in self . body_filters . clone ( ) {
525- if !filter. on_response_status_codes . is_empty ( ) && filter. on_response_status_codes . iter ( ) . all ( |v| * v != response_status_code) {
526- continue ;
552+ if !filter. on_response_status_codes . is_empty ( ) {
553+ if !filter. exclude_response_status_codes && filter. on_response_status_codes . iter ( ) . all ( |v| * v != response_status_code) {
554+ continue ;
555+ }
556+
557+ if filter. exclude_response_status_codes && filter. on_response_status_codes . contains ( & response_status_code) {
558+ continue ;
559+ }
527560 }
528561
529562 if !rule_applied {
0 commit comments