diff --git a/src/common.rs b/src/common.rs index 07da3ea17..254c910e6 100644 --- a/src/common.rs +++ b/src/common.rs @@ -478,7 +478,7 @@ pub fn username() -> String { pub fn check_port(host: T, port: i32) -> String { let host = host.to_string(); if is_ipv6_str(&host) { - if host.contains("[") { + if host.starts_with("[") { return host; } return format!("[{}]:{}", host, port); @@ -489,6 +489,31 @@ pub fn check_port(host: T, port: i32) -> String { return host; } +#[inline] +pub fn increase_port(host: T, offset: i32) -> String { + let host = host.to_string(); + if is_ipv6_str(&host) { + if host.starts_with("[") { + let tmp: Vec<&str> = host.split("]:").collect(); + if tmp.len() == 2 { + let port: i32 = tmp[1].parse().unwrap_or(0); + if port > 0 { + return format!("{}]:{}", tmp[0], port + offset); + } + } + } + } else if host.contains(":") { + let tmp: Vec<&str> = host.split(":").collect(); + if tmp.len() == 2 { + let port: i32 = tmp[1].parse().unwrap_or(0); + if port > 0 { + return format!("{}:{}", tmp[0], port + offset); + } + } + } + return host; +} + pub const POSTFIX_SERVICE: &'static str = "_service"; #[inline] @@ -721,8 +746,17 @@ mod test_common { fn test_check_port() { assert_eq!(check_port("[1:2]:12", 32), "[1:2]:12"); assert_eq!(check_port("1:2", 32), "[1:2]:32"); + assert_eq!(check_port("z1:2", 32), "z1:2"); assert_eq!(check_port("1.1.1.1", 32), "1.1.1.1:32"); assert_eq!(check_port("1.1.1.1:32", 32), "1.1.1.1:32"); assert_eq!(check_port("test.com:32", 0), "test.com:32"); + assert_eq!(increase_port("[1:2]:12", 1), "[1:2]:13"); + assert_eq!(increase_port("1.2.2.4:12", 1), "1.2.2.4:13"); + assert_eq!(increase_port("1.2.2.4", 1), "1.2.2.4"); + assert_eq!(increase_port("test.com", 1), "test.com"); + assert_eq!(increase_port("test.com:13", 4), "test.com:17"); + assert_eq!(increase_port("1:13", 4), "1:13"); + assert_eq!(increase_port("22:1:13", 4), "22:1:13"); + assert_eq!(increase_port("z1:2", 1), "z1:3"); } } diff --git a/src/rendezvous_mediator.rs b/src/rendezvous_mediator.rs index 2dccb3f1a..73c017e2e 100644 --- a/src/rendezvous_mediator.rs +++ b/src/rendezvous_mediator.rs @@ -475,15 +475,7 @@ impl RendezvousMediator { relay_server = provided_by_rendzvous_server; } if relay_server.is_empty() { - if self.host.contains(":") { - let tmp: Vec<&str> = self.host.split(":").collect(); - if tmp.len() == 2 { - let port: u16 = tmp[1].parse().unwrap_or(0); - relay_server = format!("{}:{}", tmp[0], port + 1); - } - } else { - relay_server = self.host.clone(); - } + relay_server = crate::increase_port(&self.host, 1); } relay_server }