pub fn validate_proxy_str(proxy: impl Into<String>) -> bool {
let proxy_str = proxy.into();
let proxy_split = proxy_str.split("://").collect::<Vec<&str>>();
if proxy_split.len() != 2 {
return false;
}
let without_protocol = proxy_split[1].split("@").collect::<Vec<&str>>();
if without_protocol.len() > 2 {
return false;
}
let (protocol, auth, addr) = {
if without_protocol.len() == 2 {
(proxy_split[0], Some(without_protocol[0]), without_protocol[1])
} else {
(proxy_split[0], None, without_protocol[0])
}
};
let allowed_protocols = {
let mut list = Vec::new();
#[cfg(feature = "http")]
list.push("http");
#[cfg(feature = "https")]
list.push("https");
#[cfg(feature = "socks4")]
list.push("socks4");
#[cfg(feature = "socks5")]
list.push("socks5");
list
};
if !allowed_protocols.contains(&protocol) {
return false;
}
if let Some(a) = auth {
let auth_data_count = a.split(":").count();
#[cfg(feature = "socks4")]
if protocol == "socks4" {
if auth_data_count != 1 {
return false;
}
} else {
if auth_data_count != 2 {
return false;
}
}
#[cfg(not(feature = "socks4"))]
if auth_data_count != 2 {
return false;
}
}
let addr_split = addr.split(":").collect::<Vec<&str>>();
if addr_split.len() != 2 {
return false;
}
let ip_octecs_count = addr_split[0].split(".").count();
if ip_octecs_count != 4 {
return false;
}
true
}