@@ -9227,6 +9227,108 @@ fn test_rule_ip_trigger_not_in_range_2() {
92279227 assert_eq!(action.should_log_request(true, response_status_code, None), true);
92289228}
92299229
9230+ fn setup_rule_methods_trigger() -> Router<Rule> {
9231+ let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
9232+ let mut router = Router::<Rule>::from_config(config);
9233+
9234+ let route_1: Rule = serde_json::from_str(r#"{"id":"rule-exclude-methods","rank":0,"source":{"methods":["GET","POST"],"path":"/exclude-methods"},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9235+ router.insert(route_1.into_route(&router.config));
9236+
9237+ let route_2: Rule = serde_json::from_str(r#"{"id":"rule-include-methods","rank":0,"source":{"methods":["GET","POST"],"path":"/include-methods"},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9238+ router.insert(route_2.into_route(&router.config));
9239+
9240+ router
9241+ }
9242+
9243+
9244+ #[test]
9245+ fn test_rule_methods_trigger_1() {
9246+ let router = setup_rule_methods_trigger();
9247+ let default_config = RouterConfig::default();
9248+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-methods"#), r#"/include-methods"#.to_string(),None,None,Some(r#"GET"#.to_string()),None,None);
9249+
9250+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9251+ let matched = router.match_request(&request_configured);
9252+ let traces = router.trace_request(&request_configured);
9253+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9254+
9255+ assert_eq!(!matched.is_empty(), true);
9256+ assert_eq!(!routes_traces.is_empty(), true);
9257+
9258+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
9259+ let response_status_code = 0;
9260+
9261+ let action_status_code = action.get_status_code(response_status_code, None);
9262+ assert_eq!(action_status_code, 302);
9263+ let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9264+ assert_eq!(headers.len(), 1);
9265+
9266+ let target_header = headers.first().unwrap();
9267+ assert_eq!(target_header.name, "Location");
9268+ assert_eq!(target_header.value, r#"/bar"#);
9269+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
9270+ }
9271+
9272+ #[test]
9273+ fn test_rule_methods_trigger_2() {
9274+ let router = setup_rule_methods_trigger();
9275+ let default_config = RouterConfig::default();
9276+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-methods"#), r#"/include-methods"#.to_string(),None,None,Some(r#"HEAD"#.to_string()),None,None);
9277+
9278+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9279+ let matched = router.match_request(&request_configured);
9280+ let traces = router.trace_request(&request_configured);
9281+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9282+
9283+ assert_eq!(!matched.is_empty(), false);
9284+ assert_eq!(!routes_traces.is_empty(), false);
9285+
9286+ }
9287+
9288+ #[test]
9289+ fn test_rule_methods_trigger_3() {
9290+ let router = setup_rule_methods_trigger();
9291+ let default_config = RouterConfig::default();
9292+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-methods"#), r#"/exclude-methods"#.to_string(),None,None,Some(r#"GET"#.to_string()),None,None);
9293+
9294+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9295+ let matched = router.match_request(&request_configured);
9296+ let traces = router.trace_request(&request_configured);
9297+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9298+
9299+ assert_eq!(!matched.is_empty(), false);
9300+ assert_eq!(!routes_traces.is_empty(), false);
9301+
9302+ }
9303+
9304+ #[test]
9305+ fn test_rule_methods_trigger_4() {
9306+ let router = setup_rule_methods_trigger();
9307+ let default_config = RouterConfig::default();
9308+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-methods"#), r#"/exclude-methods"#.to_string(),None,None,Some(r#"HEAD"#.to_string()),None,None);
9309+
9310+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9311+ let matched = router.match_request(&request_configured);
9312+ let traces = router.trace_request(&request_configured);
9313+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9314+
9315+ assert_eq!(!matched.is_empty(), true);
9316+ assert_eq!(!routes_traces.is_empty(), true);
9317+
9318+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
9319+ let response_status_code = 0;
9320+
9321+ let action_status_code = action.get_status_code(response_status_code, None);
9322+ assert_eq!(action_status_code, 302);
9323+ let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9324+ assert_eq!(headers.len(), 1);
9325+
9326+ let target_header = headers.first().unwrap();
9327+ assert_eq!(target_header.name, "Location");
9328+ assert_eq!(target_header.value, r#"/bar"#);
9329+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
9330+ }
9331+
92309332fn setup_rule_multiple_headers() -> Router<Rule> {
92319333 let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
92329334 let mut router = Router::<Rule>::from_config(config);
@@ -9672,6 +9774,108 @@ fn test_rule_querystring_2() {
96729774 assert_eq!(action.should_log_request(true, response_status_code, None), true);
96739775}
96749776
9777+ fn setup_rule_response_status_codes_trigger() -> Router<Rule> {
9778+ let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
9779+ let mut router = Router::<Rule>::from_config(config);
9780+
9781+ let route_1: Rule = serde_json::from_str(r#"{"id":"rule-exclude-status-codes","rank":0,"source":{"path":"/exclude-status-codes","response_status_codes":[200,201]},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9782+ router.insert(route_1.into_route(&router.config));
9783+
9784+ let route_2: Rule = serde_json::from_str(r#"{"id":"rule-include-status-codes","rank":0,"source":{"path":"/include-status-codes","response_status_codes":[200,201]},"status_code":302,"target":"/bar"}"#).expect("cannot deserialize");
9785+ router.insert(route_2.into_route(&router.config));
9786+
9787+ router
9788+ }
9789+
9790+
9791+ #[test]
9792+ fn test_rule_response_status_codes_trigger_1() {
9793+ let router = setup_rule_response_status_codes_trigger();
9794+ let default_config = RouterConfig::default();
9795+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-status-codes"#), r#"/include-status-codes"#.to_string(),None,None,None,None,None);
9796+
9797+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9798+ let matched = router.match_request(&request_configured);
9799+ let traces = router.trace_request(&request_configured);
9800+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9801+
9802+ assert_eq!(!matched.is_empty(), true);
9803+ assert_eq!(!routes_traces.is_empty(), true);
9804+
9805+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
9806+ let response_status_code = 200;
9807+
9808+ let action_status_code = action.get_status_code(response_status_code, None);
9809+ assert_eq!(action_status_code, 302);
9810+ let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9811+ assert_eq!(headers.len(), 1);
9812+
9813+ let target_header = headers.first().unwrap();
9814+ assert_eq!(target_header.name, "Location");
9815+ assert_eq!(target_header.value, r#"/bar"#);
9816+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
9817+ }
9818+
9819+ #[test]
9820+ fn test_rule_response_status_codes_trigger_2() {
9821+ let router = setup_rule_response_status_codes_trigger();
9822+ let default_config = RouterConfig::default();
9823+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/include-status-codes"#), r#"/include-status-codes"#.to_string(),None,None,None,None,None);
9824+
9825+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9826+ let matched = router.match_request(&request_configured);
9827+ let traces = router.trace_request(&request_configured);
9828+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9829+
9830+ assert_eq!(!matched.is_empty(), false);
9831+ assert_eq!(!routes_traces.is_empty(), false);
9832+
9833+ }
9834+
9835+ #[test]
9836+ fn test_rule_response_status_codes_trigger_3() {
9837+ let router = setup_rule_response_status_codes_trigger();
9838+ let default_config = RouterConfig::default();
9839+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-status-codes"#), r#"/exclude-status-codes"#.to_string(),None,None,None,None,None);
9840+
9841+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9842+ let matched = router.match_request(&request_configured);
9843+ let traces = router.trace_request(&request_configured);
9844+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9845+
9846+ assert_eq!(!matched.is_empty(), false);
9847+ assert_eq!(!routes_traces.is_empty(), false);
9848+
9849+ }
9850+
9851+ #[test]
9852+ fn test_rule_response_status_codes_trigger_4() {
9853+ let router = setup_rule_response_status_codes_trigger();
9854+ let default_config = RouterConfig::default();
9855+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/exclude-status-codes"#), r#"/exclude-status-codes"#.to_string(),None,None,None,None,None);
9856+
9857+ let request_configured = Request::rebuild_with_config(&router.config, &request);
9858+ let matched = router.match_request(&request_configured);
9859+ let traces = router.trace_request(&request_configured);
9860+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
9861+
9862+ assert_eq!(!matched.is_empty(), true);
9863+ assert_eq!(!routes_traces.is_empty(), true);
9864+
9865+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
9866+ let response_status_code = 400;
9867+
9868+ let action_status_code = action.get_status_code(response_status_code, None);
9869+ assert_eq!(action_status_code, 302);
9870+ let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
9871+ assert_eq!(headers.len(), 1);
9872+
9873+ let target_header = headers.first().unwrap();
9874+ assert_eq!(target_header.name, "Location");
9875+ assert_eq!(target_header.value, r#"/bar"#);
9876+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
9877+ }
9878+
96759879fn setup_rule_sampling() -> Router<Rule> {
96769880 let config: RouterConfig = serde_json::from_str(r#"{"always_match_any_host":false,"ignore_header_case":false,"ignore_host_case":false,"ignore_marketing_query_params":true,"ignore_path_and_query_case":false,"marketing_query_params":["utm_source","utm_medium","utm_campaign","utm_term","utm_content"],"pass_marketing_query_params_to_target":true}"#).expect("cannot deserialize");
96779881 let mut router = Router::<Rule>::from_config(config);
0 commit comments