Merge pull request #2851 from AutumnSun1996/master
Allow direct connect to {hostname}:{port}
This commit is contained in:
commit
b3465e1c13
@ -321,6 +321,18 @@ pub fn is_ip_str(id: &str) -> bool {
|
|||||||
is_ipv4_str(id) || is_ipv6_str(id)
|
is_ipv4_str(id) || is_ipv6_str(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_domain_port_str(id: &str) -> bool {
|
||||||
|
// modified regex for RFC1123 hostname. check https://stackoverflow.com/a/106223 for original version for hostname.
|
||||||
|
// according to [TLD List](https://data.iana.org/TLD/tlds-alpha-by-domain.txt) version 2023011700,
|
||||||
|
// there is no digits in TLD, and length is 2~63.
|
||||||
|
regex::Regex::new(
|
||||||
|
r"(?i)^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z-]{0,61}[a-z]:\d{1,5}$",
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.is_match(id)
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test_lib {
|
mod test_lib {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -340,4 +352,25 @@ mod test_lib {
|
|||||||
assert_eq!(is_ipv6_str("[1:2::0]:"), false);
|
assert_eq!(is_ipv6_str("[1:2::0]:"), false);
|
||||||
assert_eq!(is_ipv6_str("1:2::0]:1"), false);
|
assert_eq!(is_ipv6_str("1:2::0]:1"), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_hostname_port() {
|
||||||
|
assert_eq!(is_domain_port_str("a:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("a.b.c:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("test.com:12"), true);
|
||||||
|
assert_eq!(is_domain_port_str("test-UPPER.com:12"), true);
|
||||||
|
assert_eq!(is_domain_port_str("some-other.domain.com:12"), true);
|
||||||
|
assert_eq!(is_domain_port_str("under_score:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("a@bc:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("1.1.1.1:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("1.2.3:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("1.2.3.45:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str("a.b.c:123456"), false);
|
||||||
|
assert_eq!(is_domain_port_str("---:12"), false);
|
||||||
|
assert_eq!(is_domain_port_str(".:12"), false);
|
||||||
|
// todo: should we also check for these edge cases?
|
||||||
|
// out-of-range port
|
||||||
|
assert_eq!(is_domain_port_str("test.com:0"), true);
|
||||||
|
assert_eq!(is_domain_port_str("test.com:98989"), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,10 @@ use cpal::{
|
|||||||
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
use magnum_opus::{Channels::*, Decoder as AudioDecoder};
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use std::{
|
use std::{
|
||||||
str::FromStr,
|
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
ops::{Deref, Not},
|
ops::{Deref, Not},
|
||||||
|
str::FromStr,
|
||||||
sync::{atomic::AtomicBool, mpsc, Arc, Mutex, RwLock},
|
sync::{atomic::AtomicBool, mpsc, Arc, Mutex, RwLock},
|
||||||
};
|
};
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
@ -181,6 +181,13 @@ impl Client {
|
|||||||
true,
|
true,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
// Allow connect to {domain}:{port}
|
||||||
|
if hbb_common::is_domain_port_str(peer) {
|
||||||
|
return Ok((
|
||||||
|
socket_client::connect_tcp(peer, RENDEZVOUS_TIMEOUT).await?,
|
||||||
|
true,
|
||||||
|
));
|
||||||
|
}
|
||||||
let (mut rendezvous_server, servers, contained) = crate::get_rendezvous_server(1_000).await;
|
let (mut rendezvous_server, servers, contained) = crate::get_rendezvous_server(1_000).await;
|
||||||
let mut socket = socket_client::connect_tcp(&*rendezvous_server, RENDEZVOUS_TIMEOUT).await;
|
let mut socket = socket_client::connect_tcp(&*rendezvous_server, RENDEZVOUS_TIMEOUT).await;
|
||||||
debug_assert!(!servers.contains(&rendezvous_server));
|
debug_assert!(!servers.contains(&rendezvous_server));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user