Skip to content

Commit e2d5dc1

Browse files
committed
exclue response status codes in rust
1 parent 0b4c9b5 commit e2d5dc1

11 files changed

+81
-11
lines changed

src/action/log_override.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub struct LogOverride {
55
pub log_override: bool,
66
pub rule_id: Option<String>,
77
pub on_response_status_codes: Vec<u16>,
8+
pub exclude_response_status_codes: bool,
89
pub fallback_log_override: Option<bool>,
910
pub fallback_rule_id: Option<String>,
1011
pub unit_id: Option<String>,
@@ -16,7 +17,11 @@ impl LogOverride {
1617
return (Some(self.log_override), self.rule_id.clone(), true);
1718
}
1819

19-
if self.on_response_status_codes.iter().any(|v| *v == response_status_code) {
20+
if self.exclude_response_status_codes && !self.on_response_status_codes.contains(&response_status_code) {
21+
return (Some(self.log_override), self.rule_id.clone(), true);
22+
}
23+
24+
if !self.exclude_response_status_codes && self.on_response_status_codes.iter().any(|v| *v == response_status_code) {
2025
return (Some(self.log_override), self.rule_id.clone(), true);
2126
}
2227

src/action/mod.rs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ pub struct Action {
4747
pub 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 {
146147
struct 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)]
153155
struct 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 {

src/action/status_code_update.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use serde::{Deserialize, Serialize};
44
pub struct StatusCodeUpdate {
55
pub status_code: u16,
66
pub on_response_status_codes: Vec<u16>,
7+
pub exclude_response_status_codes: bool,
78
pub fallback_status_code: u16,
89
pub rule_id: Option<String>,
910
pub fallback_rule_id: Option<String>,
@@ -17,7 +18,12 @@ impl StatusCodeUpdate {
1718
return (self.status_code, self.rule_id.clone());
1819
}
1920

20-
if self.on_response_status_codes.iter().any(|v| *v == response_status_code) {
21+
if self.exclude_response_status_codes && !self.on_response_status_codes.contains(&response_status_code)
22+
{
23+
return (self.status_code, self.rule_id.clone());
24+
}
25+
26+
if !self.exclude_response_status_codes && self.on_response_status_codes.iter().any(|v| *v == response_status_code) {
2127
return (self.status_code, self.rule_id.clone());
2228
}
2329

tests/redirectionio_router_test.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9827,9 +9827,15 @@ fn test_rule_response_status_codes_trigger_2() {
98279827
let traces = router.trace_request(&request_configured);
98289828
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
98299829

9830-
assert_eq!(!matched.is_empty(), false);
9831-
assert_eq!(!routes_traces.is_empty(), false);
9830+
assert_eq!(!matched.is_empty(), true);
9831+
assert_eq!(!routes_traces.is_empty(), true);
9832+
9833+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9834+
let response_status_code = 400;
98329835

9836+
let action_status_code = action.get_status_code(response_status_code, None);
9837+
assert_eq!(action_status_code, 0);
9838+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
98339839
}
98349840

98359841
#[test]
@@ -9843,9 +9849,15 @@ fn test_rule_response_status_codes_trigger_3() {
98439849
let traces = router.trace_request(&request_configured);
98449850
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
98459851

9846-
assert_eq!(!matched.is_empty(), false);
9847-
assert_eq!(!routes_traces.is_empty(), false);
9852+
assert_eq!(!matched.is_empty(), true);
9853+
assert_eq!(!routes_traces.is_empty(), true);
9854+
9855+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
9856+
let response_status_code = 200;
98489857

9858+
let action_status_code = action.get_status_code(response_status_code, None);
9859+
assert_eq!(action_status_code, 0);
9860+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
98499861
}
98509862

98519863
#[test]

tests/test_examples/configuration_log_off.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": null,

tests/test_examples/configuration_reset_on.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": null,

tests/test_examples/header_override.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": "",

tests/test_examples/header_remove.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": "",

tests/test_examples/header_replace.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": "",

tests/test_examples/must_match_false_broken.out.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414
"query": "",
1515
"headers": [],
1616
"methods": [],
17+
"exclude_methods": null,
1718
"response_status_codes": [],
19+
"exclude_response_status_codes": null,
1820
"sampling": null
1921
},
2022
"target": "",

0 commit comments

Comments
 (0)