@@ -830,6 +830,108 @@ fn test_06_emojis_1() {
830830 assert_eq!(action.should_log_request(true, response_status_code, None), true);
831831}
832832
833+ fn setup_action_custom_body() -> Router<Rule> {
834+ 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");
835+ let mut router = Router::<Rule>::from_config(config);
836+
837+ let route_1: Rule = serde_json::from_str(r#"{"body_filters":[{"action":"replace_text","content":"{\"pets\":[{\"name\":\"Jo\",\"species\":\"Parrot\",\"birthYear\":2016},{\"name\":\"Charlotte\",\"species\":\"Cat\",\"birthYear\":2008}]}"}],"header_filters":[{"action":"override","header":"Content-Type","value":"application/json"}],"id":"action-custom-body","rank":0,"source":{"path":"/json-body"}}"#).expect("cannot deserialize");
838+ router.insert(route_1.into_route(&router.config));
839+
840+ let route_2: Rule = serde_json::from_str(r#"{"body_filters":[{"action":"replace_text","content":"{\"pets\":[{\"name\":\"Jo\",\"species\":\"Parrot\",\"birthYear\":2016},{\"name\":\"Charlotte\",\"species\":\"Cat\",\"birthYear\":2008}]}"}],"header_filters":[{"action":"override","header":"Content-Type","value":"text/javascript"}],"id":"action-custom-body-with-header","rank":0,"source":{"path":"/json-body-and-header"}}"#).expect("cannot deserialize");
841+ router.insert(route_2.into_route(&router.config));
842+
843+ router
844+ }
845+
846+
847+ #[test]
848+ fn test_action_custom_body_1() {
849+ let router = setup_action_custom_body();
850+ let default_config = RouterConfig::default();
851+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/json-body"#), r#"/json-body"#.to_string(),None,None,None,None,None);
852+
853+ let request_configured = Request::rebuild_with_config(&router.config, &request);
854+ let matched = router.match_request(&request_configured);
855+ let traces = router.trace_request(&request_configured);
856+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
857+
858+ assert_eq!(!matched.is_empty(), true);
859+ assert_eq!(!routes_traces.is_empty(), true);
860+
861+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
862+ let response_status_code = 0;
863+
864+ let action_status_code = action.get_status_code(response_status_code, None);
865+ assert_eq!(action_status_code, 0);
866+ let body_filter_opt = action.create_filter_body(response_status_code, &[]);
867+ assert_eq!(body_filter_opt.is_some(), true);
868+
869+ let mut body_filter = body_filter_opt.unwrap();
870+ let mut new_body = body_filter.filter(r#""#.as_bytes().to_vec(), None);
871+ new_body.extend(body_filter.end(None));
872+ assert_eq!(new_body, r#"{"pets":[{"name":"Jo","species":"Parrot","birthYear":2016},{"name":"Charlotte","species":"Cat","birthYear":2008}]}"#.as_bytes().to_vec());
873+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
874+ let mut response_headers = Vec::new();
875+
876+ response_headers.push(Header {
877+ name: r#"Content-Type"#.to_string(),
878+ value: r#"text/plain"#.to_string(),
879+ });
880+
881+ let filtered_headers = action.filter_headers(response_headers, response_status_code, false, None);
882+ let header_map = Header::create_header_map(filtered_headers);
883+
884+ let value = header_map.get(r#"Content-Type"#);
885+
886+ assert!(value.is_some());
887+ assert_eq!(value.unwrap(), r#"application/json"#);
888+
889+ }
890+
891+ #[test]
892+ fn test_action_custom_body_2() {
893+ let router = setup_action_custom_body();
894+ let default_config = RouterConfig::default();
895+ let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/json-body-and-header"#), r#"/json-body-and-header"#.to_string(),None,None,None,None,None);
896+
897+ let request_configured = Request::rebuild_with_config(&router.config, &request);
898+ let matched = router.match_request(&request_configured);
899+ let traces = router.trace_request(&request_configured);
900+ let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
901+
902+ assert_eq!(!matched.is_empty(), true);
903+ assert_eq!(!routes_traces.is_empty(), true);
904+
905+ let mut action = Action::from_routes_rule(matched, &request_configured, None);
906+ let response_status_code = 0;
907+
908+ let action_status_code = action.get_status_code(response_status_code, None);
909+ assert_eq!(action_status_code, 0);
910+ let body_filter_opt = action.create_filter_body(response_status_code, &[]);
911+ assert_eq!(body_filter_opt.is_some(), true);
912+
913+ let mut body_filter = body_filter_opt.unwrap();
914+ let mut new_body = body_filter.filter(r#""#.as_bytes().to_vec(), None);
915+ new_body.extend(body_filter.end(None));
916+ assert_eq!(new_body, r#"{"pets":[{"name":"Jo","species":"Parrot","birthYear":2016},{"name":"Charlotte","species":"Cat","birthYear":2008}]}"#.as_bytes().to_vec());
917+ assert_eq!(action.should_log_request(true, response_status_code, None), true);
918+ let mut response_headers = Vec::new();
919+
920+ response_headers.push(Header {
921+ name: r#"Content-Type"#.to_string(),
922+ value: r#"text/plain"#.to_string(),
923+ });
924+
925+ let filtered_headers = action.filter_headers(response_headers, response_status_code, false, None);
926+ let header_map = Header::create_header_map(filtered_headers);
927+
928+ let value = header_map.get(r#"Content-Type"#);
929+
930+ assert!(value.is_some());
931+ assert_eq!(value.unwrap(), r#"text/javascript"#);
932+
933+ }
934+
833935fn setup_action_disable_log() -> Router<Rule> {
834936 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");
835937 let mut router = Router::<Rule>::from_config(config);
0 commit comments