| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- use std::env;
- use std::net::{IpAddr, Ipv4Addr, SocketAddr};
- use tracing::trace;
- pub enum ProxyEnum {
- REST,
- WS,
- }
- pub enum ProxyResponseEnum {
- NO,
- YES(SocketAddr),
- }
- /**代理工具*/
- #[derive(Debug)]
- #[derive(Clone)]
- pub struct ParsingDetail {
- pub ip_address: String,
- pub port: String,
- }
- impl ParsingDetail {
- pub fn env_proxy(proxy_enum: ProxyEnum) -> ProxyResponseEnum {
- let proxy_address = env::var("proxy_address");
- // 使用std::env::var函数获取环境变量的值,如果返回Err,则说明环境变量不存在
- let ip_port = match proxy_address {
- Ok(value) => {
- trace!("环境变量读取成功:key:proxy_address , val:{}", value);
- env::set_var("http_proxy", value.to_string());
- env::set_var("https_proxy", value.to_string());
- value
- }
- Err(_) => {
- trace!("环境变量读取失败:'proxy_address'");
- "".to_string()
- }
- };
- if ip_port.len() > 0 {
- match proxy_enum {
- ProxyEnum::REST => {
- env::set_var("http_proxy", ip_port.to_string());
- env::set_var("https_proxy", ip_port.to_string());
- return ProxyResponseEnum::NO;
- }
- ProxyEnum::WS => {
- let ip_port: Vec<&str> = ip_port.split(":").collect();
- let ip_array: Vec<&str> = ip_port[0].split(".").collect();
- let proxy = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(
- ip_array[0].parse().unwrap(),
- ip_array[1].parse().unwrap(),
- ip_array[2].parse().unwrap(),
- ip_array[3].parse().unwrap())
- ), ip_port[1].parse().unwrap());
- return ProxyResponseEnum::YES(proxy);
- }
- }
- }
- return ProxyResponseEnum::NO;
- }
- fn new(ip_address: String,
- port: String, ) -> ParsingDetail {
- ParsingDetail { ip_address, port }
- }
- //获取环境变量配置'proxy_address'拿到代理地址
- pub fn parsing_environment_variables() -> ParsingDetail {
- let proxy_address = env::var("proxy_address");
- // 使用std::env::var函数获取环境变量的值,如果返回Err,则说明环境变量不存在
- match proxy_address {
- Ok(value) => {
- //trace!("环境变量读取成功:key:proxy_address , val:{}", value);
- env::set_var("http_proxy", value.to_string());
- env::set_var("https_proxy", value.to_string());
- let ip_port: Vec<&str> = value.split(":").collect();
- let parsing_detail = ParsingDetail::new(ip_port[0].to_string(), ip_port[1].to_string());
- parsing_detail
- }
- Err(_) => {
- trace!("环境变量读取失败:'proxy_address'");
- let parsing_detail = ParsingDetail::new("".to_string(), "".to_string());
- parsing_detail
- }
- }
- }
- //http请求是否开启代理:HTTP 只需要调用该方法即可
- //原理是 设置全局代理,所以程序如果要走代理只需要执行一次,后续的get,post..都会走代理
- pub fn http_enable_proxy() -> bool {
- //拿到环境变量解析的数据
- let parsing_detail = Self::parsing_environment_variables();
- if parsing_detail.ip_address.len() > 0 && parsing_detail.port.len() > 0 {
- let http_proxy = format!("http://{}:{}", parsing_detail.ip_address, parsing_detail.port);
- env::set_var("http_proxy", http_proxy.clone());
- env::set_var("https_proxy", http_proxy.clone());
- //trace!("代理设置成功{0}", http_proxy.to_string());
- true
- } else {
- //trace!("无法开启代理:环境变量获取失败:{:?}", parsing_detail);
- false
- }
- }
- }
|