support WSS IP Urls

This commit is contained in:
Christien Rioux 2023-10-18 14:49:14 -04:00
parent 5757a5badf
commit c4b8985263

View File

@ -54,11 +54,12 @@ impl fmt::Display for DialInfo {
SplitUrlHost::Hostname(_) => { SplitUrlHost::Hostname(_) => {
write!(f, "wss|{}|{}", di.socket_address.ip_addr(), di.request) write!(f, "wss|{}|{}", di.socket_address.ip_addr(), di.request)
} }
SplitUrlHost::IpAddr(_) => { SplitUrlHost::IpAddr(a) => {
panic!( if di.socket_address.ip_addr() == a {
"secure websockets can not use ip address in request: {}", write!(f, "wss|{}", di.request)
di.request } else {
); panic!("resolved address does not match url: {}", di.request);
}
} }
} }
} }
@ -119,19 +120,24 @@ impl FromStr for DialInfo {
} }
let url_port = split_url.port.unwrap_or(443u16); let url_port = split_url.port.unwrap_or(443u16);
let (a, rest) = rest.split_once('|').ok_or_else(|| { match rest.split_once('|') {
VeilidAPIError::parse_error( Some((sa, rest)) => {
"DialInfo::from_str missing socket address '|' separator", let address = Address::from_str(sa)?;
s,
)
})?;
let address = Address::from_str(a)?;
DialInfo::try_wss( DialInfo::try_wss(
SocketAddress::new(address, url_port), SocketAddress::new(address, url_port),
format!("wss://{}", rest), format!("wss://{}", rest),
) )
} }
None => {
let address = Address::from_str(&split_url.host.to_string())?;
DialInfo::try_wss(
SocketAddress::new(address, url_port),
format!("wss://{}", rest),
)
}
}
}
_ => Err(VeilidAPIError::parse_error( _ => Err(VeilidAPIError::parse_error(
"DialInfo::from_str has invalid scheme", "DialInfo::from_str has invalid scheme",
s, s,
@ -196,12 +202,14 @@ impl DialInfo {
if url_port != socket_address.port() { if url_port != socket_address.port() {
apibail_parse_error!("socket address port doesn't match url port", url); apibail_parse_error!("socket address port doesn't match url port", url);
} }
if !matches!(split_url.host, SplitUrlHost::Hostname(_)) { if let SplitUrlHost::IpAddr(a) = split_url.host {
if socket_address.ip_addr() != a {
apibail_parse_error!( apibail_parse_error!(
"WSS url can not use address format, only hostname format", format!("request address does not match socket address: {}", a),
url socket_address
); );
} }
}
Ok(Self::WSS(DialInfoWSS { Ok(Self::WSS(DialInfoWSS {
socket_address: socket_address.canonical(), socket_address: socket_address.canonical(),
request: url[6..].to_string(), request: url[6..].to_string(),