feat: recognize different protocols

This commit is contained in:
Keivan-sf
2023-10-09 17:59:25 +03:30
parent 081e036257
commit e4db6a92af
2 changed files with 32 additions and 5 deletions

View File

@@ -2,7 +2,7 @@ use std::process::exit;
mod parser; mod parser;
fn main() { fn main() {
let protocol = parser::get_uri_format("vmess://"); let protocol = parser::get_uri_protocol("vmess://");
match protocol { match protocol {
Some(parser::protocols::Vless) => { Some(parser::protocols::Vless) => {
println!("The protocol was Vless"); println!("The protocol was Vless");

View File

@@ -9,7 +9,7 @@ pub enum protocols {
Http, Http,
} }
pub fn get_uri_format(uri: &str) -> Option<protocols> { pub fn get_uri_protocol(uri: &str) -> Option<protocols> {
let uri_regex = Regex::new(r"^[a-z]+:\/\/.+$").unwrap(); let uri_regex = Regex::new(r"^[a-z]+:\/\/.+$").unwrap();
if !uri_regex.is_match(uri) { if !uri_regex.is_match(uri) {
return None; return None;
@@ -20,6 +20,18 @@ pub fn get_uri_format(uri: &str) -> Option<protocols> {
if uri.starts_with("vless://") { if uri.starts_with("vless://") {
return Some(protocols::Vless); return Some(protocols::Vless);
} }
if uri.starts_with("ss://") {
return Some(protocols::Shadowsocks);
}
if uri.starts_with("socks://") {
return Some(protocols::Socks);
}
if uri.starts_with("http://") {
return Some(protocols::Http);
}
if uri.starts_with("trojan://") {
return Some(protocols::Trojan);
}
return None; return None;
} }
@@ -28,12 +40,27 @@ mod tests {
use super::*; use super::*;
#[test] #[test]
fn return_none_for_invalid_uri() { fn return_none_for_invalid_uri() {
let protocol = get_uri_format("123-vless://3d1c3f04-729d-59d3-bdb6-3f3f4352e173@root.ii.one:2083?security=reality&sni=www.spamhaus.org&fp=safari&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision#Ha-ac"); let protocol = get_uri_protocol("123-vless://3d1c3f04-729d-59d3-bdb6-3f3f4352e173@root.ii.one:2083?security=reality&sni=www.spamhaus.org&fp=safari&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision#Ha-ac");
assert!(matches!(protocol, None)); assert!(matches!(protocol, None));
} }
#[test] #[test]
fn recognize_vless_format() { fn recognize_vless_protocol() {
let protocol = get_uri_format("vless://3d1c3f04-729d-59d3-bdb6-3f3f4352e173@root.ii.one:2083?security=reality&sni=www.spamhaus.org&fp=safari&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision#Ha-ac").unwrap(); let protocol = get_uri_protocol("vless://3d1c3f04-729d-59d3-bdb6-3f3f4352e173@root.ii.one:2083?security=reality&sni=www.spamhaus.org&fp=safari&pbk=7xhH4b_VkliBxGulljcyPOH-bYUA2dl-XAdZAsfhk04&sid=6ba85179e30d4fc2&type=tcp&flow=xtls-rprx-vision#Ha-ac").unwrap();
assert!(matches!(protocol, protocols::Vless)); assert!(matches!(protocol, protocols::Vless));
} }
#[test]
fn recognize_vmess_protocol() {
let protocol = get_uri_protocol("vmess://eyJhZGQiOiIxMjcuMC4wLjEiLCJhaWQiOiIwIiwiaG9zdCI6IiIsImlkIjoiOHM2OTdlMmMtZXMxNy00MDNkLTI0ZjMtZHMyYzYwc2I4ZjUiLCJuZXQiOiJ0Y3AiLCJwYXRoIjoiIiwicG9ydCI6IjgwODAiLCJwcyI6InRlc3QiLCJzY3kiOiJhdXRvIiwic25pIjoiIiwidGxzIjoiIiwidHlwZSI6Im5vbmUiLCJ2IjoiMiJ9").unwrap();
assert!(matches!(protocol, protocols::Vmess));
}
#[test]
fn recognize_shadowsocks_protocol() {
let protocol = get_uri_protocol("ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpXNzRYRkFMS0t1dzZtNUlB@www.outline.aasf.cyou:443#test").unwrap();
assert!(matches!(protocol, protocols::Shadowsocks));
}
#[test]
fn recognize_trojan_protocol() {
let protocol = get_uri_protocol("trojan://test-pw@13.50.100.84:22222?security=tls&sni=trj.rollingnext.co.uk&type=tcp#test").unwrap();
assert!(matches!(protocol, protocols::Trojan));
}
} }