Skip to content

Commit 425f308

Browse files
committed
feat(router): use authority instead of host to allow matching on port
1 parent b64498f commit 425f308

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed

src/http/request.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl FromStr for Request {
4545
Ok(Request::new(
4646
PathAndQueryWithSkipped::from_config(&config, path_and_query_str),
4747
path_and_query_str.to_string(),
48-
http_request.uri().host().map(|s| s.to_string()),
48+
http_request.uri().authority().map(|s| s.to_string()),
4949
http_request.uri().scheme_str().map(|s| s.to_string()),
5050
None,
5151
None,
@@ -111,7 +111,7 @@ impl Request {
111111
let mut request = Request::from_config(
112112
router_config,
113113
path_and_query_str.to_string(),
114-
http_request.uri().host().map(|s| s.to_string()),
114+
http_request.uri().authority().map(|s| s.to_string()),
115115
http_request.uri().scheme_str().map(|s| s.to_string()),
116116
example.method.clone(),
117117
None,

tests/redirectionio_router_test.rs

+68
Original file line numberDiff line numberDiff line change
@@ -6983,6 +6983,74 @@ fn test_rule_header_regex_3() {
69836983
assert_eq!(action.should_log_request(true, response_status_code, None), true);
69846984
}
69856985

6986+
fn setup_rule_host_port() -> Router<Rule> {
6987+
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");
6988+
let mut router = Router::<Rule>::from_config(config);
6989+
6990+
let route_1: Rule = serde_json::from_str(r#"{"id":"rule-with-host-port","rank":0,"source":{"host":"example.org:8080","path":"/foo"},"status_code":302,"target":"http://example.org:8081/bar"}"#).expect("cannot deserialize");
6991+
router.insert(route_1.into_route(&router.config));
6992+
6993+
router
6994+
}
6995+
6996+
6997+
#[test]
6998+
fn test_rule_host_port_1() {
6999+
let router = setup_rule_host_port();
7000+
let default_config = RouterConfig::default();
7001+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/foo"#), r#"/foo"#.to_string(),Some(r#"example.org"#.to_string()),Some(r#"http"#.to_string()),None,None,None);
7002+
let request_configured = Request::rebuild_with_config(&router.config, &request);
7003+
let matched = router.match_request(&request_configured);
7004+
let traces = router.trace_request(&request_configured);
7005+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
7006+
7007+
assert_eq!(!matched.is_empty(), false);
7008+
assert_eq!(!routes_traces.is_empty(), false);
7009+
7010+
}
7011+
7012+
#[test]
7013+
fn test_rule_host_port_2() {
7014+
let router = setup_rule_host_port();
7015+
let default_config = RouterConfig::default();
7016+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/foo"#), r#"/foo"#.to_string(),Some(r#"example.org:4040"#.to_string()),Some(r#"http"#.to_string()),None,None,None);
7017+
let request_configured = Request::rebuild_with_config(&router.config, &request);
7018+
let matched = router.match_request(&request_configured);
7019+
let traces = router.trace_request(&request_configured);
7020+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
7021+
7022+
assert_eq!(!matched.is_empty(), false);
7023+
assert_eq!(!routes_traces.is_empty(), false);
7024+
7025+
}
7026+
7027+
#[test]
7028+
fn test_rule_host_port_3() {
7029+
let router = setup_rule_host_port();
7030+
let default_config = RouterConfig::default();
7031+
let request = Request::new(PathAndQueryWithSkipped::from_config(&default_config, r#"/foo"#), r#"/foo"#.to_string(),Some(r#"example.org:8080"#.to_string()),Some(r#"http"#.to_string()),None,None,None);
7032+
let request_configured = Request::rebuild_with_config(&router.config, &request);
7033+
let matched = router.match_request(&request_configured);
7034+
let traces = router.trace_request(&request_configured);
7035+
let routes_traces = Trace::<Rule>::get_routes_from_traces(&traces);
7036+
7037+
assert_eq!(!matched.is_empty(), true);
7038+
assert_eq!(!routes_traces.is_empty(), true);
7039+
7040+
let mut action = Action::from_routes_rule(matched, &request_configured, None);
7041+
let response_status_code = 0;
7042+
7043+
let action_status_code = action.get_status_code(response_status_code, None);
7044+
assert_eq!(action_status_code, 302);
7045+
let headers = action.filter_headers(Vec::new(), response_status_code, false, None);
7046+
assert_eq!(headers.len(), 1);
7047+
7048+
let target_header = headers.first().unwrap();
7049+
assert_eq!(target_header.name, "Location");
7050+
assert_eq!(target_header.value, r#"http://example.org:8081/bar"#);
7051+
assert_eq!(action.should_log_request(true, response_status_code, None), true);
7052+
}
7053+
69867054
fn setup_rule_ip_trigger() -> Router<Rule> {
69877055
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");
69887056
let mut router = Router::<Rule>::from_config(config);

0 commit comments

Comments
 (0)