From fd5afbfe944153935bec75946f4cdc1043ff2934 Mon Sep 17 00:00:00 2001 From: Keivan-sf Date: Thu, 10 Jul 2025 20:43:48 +0330 Subject: [PATCH] Parse ipv6 addresses resolves #4 --- Cargo.lock | 24 ++++++++++++++++++++++++ Cargo.toml | 1 + src/parser/vless/mod.rs | 30 ++++++++++++++++-------------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a1a8cba..6800c63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,6 +59,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + [[package]] name = "clap" version = "4.4.6" @@ -105,12 +111,29 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "itoa" version = "1.0.9" @@ -253,6 +276,7 @@ name = "v2parser" version = "0.1.0" dependencies = [ "clap", + "http", "querystring", "regex", "serde", diff --git a/Cargo.toml b/Cargo.toml index 7898550..4bdf4d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" [dependencies] clap = { version = "4.4.6", features = ["derive"] } +http = "1.3.1" querystring = "1.1.0" regex = "1.9.6" serde = { version = "1.0.189", features = ["derive"] } diff --git a/src/parser/vless/mod.rs b/src/parser/vless/mod.rs index 5bec00b..30dbce1 100644 --- a/src/parser/vless/mod.rs +++ b/src/parser/vless/mod.rs @@ -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::() - .expect("Wrong vless format, port is not a number"), - ), - }; + + let parsed = address_wo_slash.parse::().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";