Parse ipv6 addresses

resolves #4
This commit is contained in:
Keivan-sf
2025-07-10 20:43:48 +03:30
parent 9bfba9a405
commit fd5afbfe94
3 changed files with 41 additions and 14 deletions

View File

@@ -1,6 +1,7 @@
use querystring;
mod models;
use crate::config_models::*;
use http::Uri;
use std::process::exit;
pub fn create_outbound_object(data: models::VlessData) -> Outbound {
@@ -125,22 +126,13 @@ fn parse_vless_address(raw_data: &str) -> models::VlessAddress {
Some(data) => (String::from(data.0), data.1),
};
let address_wo_slash = raw_address.strip_suffix("/").unwrap_or(raw_address);
let (address, port): (String, u16) = match address_wo_slash.split_once(":") {
None => {
println!("Wrong vless format, no `:` found in the address");
exit(0);
}
Some(data) => (
String::from(data.0),
data.1
.parse::<u16>()
.expect("Wrong vless format, port is not a number"),
),
};
let parsed = address_wo_slash.parse::<Uri>().unwrap();
return models::VlessAddress {
uuid,
address,
port,
address: parsed.host().unwrap().to_string(),
port: parsed.port().unwrap().as_u16(),
};
}
@@ -268,6 +260,16 @@ mod tests {
assert_eq!(parsed.uuid, "uu0id");
}
#[test]
fn parse_vless_ipv6_host() {
let v = "vless://4d91916f-a7fd-419b-8b90-640bb8d1b9f4@[2a06:98c1:3120::1]:443?path=%2FPSZPkYG71g6bn84o%2FMTQxLjE0OC4yMDMuNg&security=tls&alpn=http%2F1.1&encryption=none&host=titantablomanahamrah.ir&fp=randomized&type=ws&sni=TITanTabLOmaNAHaMRaH.IR#";
let raw_host = "uu0id@[2a06:98c1:3120::1]:443";
let parsed = parse_vless_address(raw_host);
assert_eq!(parsed.port, 443);
assert_eq!(parsed.address, "[2a06:98c1:3120::1]");
assert_eq!(parsed.uuid, "uu0id");
}
#[test]
fn create_outbound_for_tcp_reality() {
let v = "vless://3d2c2r05-y739-51e3-bd86-3f3f4950c183@tr.deet23ngdell.com:1818?security=reality&encryption=none&pbk=7xhH8b_VkliBxgulljcyPOH-bYoA2dl-XAdZAsfhk04&headerType=none&fp=chrome&type=tcp&flow=xtls-rprx-vision&sni=bench.sh&sid=6bt85979e30d4fc2#%F0%9F%87%B9%F0%9F%87%B7+H";