proxy.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use std::env;
  2. use std::net::{IpAddr, Ipv4Addr, SocketAddr};
  3. use tracing::trace;
  4. pub enum ProxyEnum {
  5. REST,
  6. WS,
  7. }
  8. pub enum ProxyResponseEnum {
  9. NO,
  10. YES(SocketAddr),
  11. }
  12. /**代理工具*/
  13. #[derive(Debug)]
  14. #[derive(Clone)]
  15. pub struct ParsingDetail {
  16. pub ip_address: String,
  17. pub port: String,
  18. }
  19. impl ParsingDetail {
  20. pub fn env_proxy(proxy_enum: ProxyEnum) -> ProxyResponseEnum {
  21. let proxy_address = env::var("proxy_address");
  22. // 使用std::env::var函数获取环境变量的值,如果返回Err,则说明环境变量不存在
  23. let ip_port = match proxy_address {
  24. Ok(value) => {
  25. trace!("环境变量读取成功:key:proxy_address , val:{}", value);
  26. env::set_var("http_proxy", value.to_string());
  27. env::set_var("https_proxy", value.to_string());
  28. value
  29. }
  30. Err(_) => {
  31. trace!("环境变量读取失败:'proxy_address'");
  32. "".to_string()
  33. }
  34. };
  35. if ip_port.len() > 0 {
  36. match proxy_enum {
  37. ProxyEnum::REST => {
  38. env::set_var("http_proxy", ip_port.to_string());
  39. env::set_var("https_proxy", ip_port.to_string());
  40. return ProxyResponseEnum::NO;
  41. }
  42. ProxyEnum::WS => {
  43. let ip_port: Vec<&str> = ip_port.split(":").collect();
  44. let ip_array: Vec<&str> = ip_port[0].split(".").collect();
  45. let proxy = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(
  46. ip_array[0].parse().unwrap(),
  47. ip_array[1].parse().unwrap(),
  48. ip_array[2].parse().unwrap(),
  49. ip_array[3].parse().unwrap())
  50. ), ip_port[1].parse().unwrap());
  51. return ProxyResponseEnum::YES(proxy);
  52. }
  53. }
  54. }
  55. return ProxyResponseEnum::NO;
  56. }
  57. fn new(ip_address: String,
  58. port: String, ) -> ParsingDetail {
  59. ParsingDetail { ip_address, port }
  60. }
  61. //获取环境变量配置'proxy_address'拿到代理地址
  62. pub fn parsing_environment_variables() -> ParsingDetail {
  63. let proxy_address = env::var("proxy_address");
  64. // 使用std::env::var函数获取环境变量的值,如果返回Err,则说明环境变量不存在
  65. match proxy_address {
  66. Ok(value) => {
  67. //trace!("环境变量读取成功:key:proxy_address , val:{}", value);
  68. env::set_var("http_proxy", value.to_string());
  69. env::set_var("https_proxy", value.to_string());
  70. let ip_port: Vec<&str> = value.split(":").collect();
  71. let parsing_detail = ParsingDetail::new(ip_port[0].to_string(), ip_port[1].to_string());
  72. parsing_detail
  73. }
  74. Err(_) => {
  75. trace!("环境变量读取失败:'proxy_address'");
  76. let parsing_detail = ParsingDetail::new("".to_string(), "".to_string());
  77. parsing_detail
  78. }
  79. }
  80. }
  81. //http请求是否开启代理:HTTP 只需要调用该方法即可
  82. //原理是 设置全局代理,所以程序如果要走代理只需要执行一次,后续的get,post..都会走代理
  83. pub fn http_enable_proxy() -> bool {
  84. //拿到环境变量解析的数据
  85. let parsing_detail = Self::parsing_environment_variables();
  86. if parsing_detail.ip_address.len() > 0 && parsing_detail.port.len() > 0 {
  87. let http_proxy = format!("http://{}:{}", parsing_detail.ip_address, parsing_detail.port);
  88. env::set_var("http_proxy", http_proxy.clone());
  89. env::set_var("https_proxy", http_proxy.clone());
  90. //trace!("代理设置成功{0}", http_proxy.to_string());
  91. true
  92. } else {
  93. //trace!("无法开启代理:环境变量获取失败:{:?}", parsing_detail);
  94. false
  95. }
  96. }
  97. }