proxy.rs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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(is_unusual: Option<&str>) -> ParsingDetail {
  63. let proxy_address_name = match is_unusual {
  64. None => {
  65. "proxy_address"
  66. }
  67. Some(v) => {
  68. match v {
  69. "binance" => {
  70. "binance_proxy_address"
  71. }
  72. _ => {
  73. "proxy_address"
  74. }
  75. }
  76. }
  77. };
  78. let proxy_address = env::var(proxy_address_name);
  79. // 使用std::env::var函数获取环境变量的值,如果返回Err,则说明环境变量不存在
  80. match proxy_address {
  81. Ok(value) => {
  82. trace!("环境变量读取成功:key:proxy_address , val:{}", value);
  83. let ip_port: Vec<&str> = value.split(":").collect();
  84. let parsing_detail = ParsingDetail::new(ip_port[0].to_string(), ip_port[1].to_string());
  85. parsing_detail
  86. }
  87. Err(_) => {
  88. trace!("环境变量读取失败:'proxy_address'");
  89. let parsing_detail = ParsingDetail::new("".to_string(), "".to_string());
  90. parsing_detail
  91. }
  92. }
  93. }
  94. //http请求是否开启代理:HTTP 只需要调用该方法即可
  95. //原理是 设置全局代理,所以程序如果要走代理只需要执行一次,后续的get,post..都会走代理
  96. pub fn http_enable_proxy(is_unusual: Option<&str>) -> bool {
  97. //拿到环境变量解析的数据
  98. let parsing_detail = Self::parsing_environment_variables(is_unusual);
  99. if parsing_detail.ip_address.len() > 0 && parsing_detail.port.len() > 0 {
  100. let http_proxy = format!("http://{}:{}", parsing_detail.ip_address, parsing_detail.port);
  101. env::set_var("http_proxy", http_proxy.clone());
  102. env::set_var("https_proxy", http_proxy.clone());
  103. trace!("代理设置成功{0}", http_proxy.to_string());
  104. true
  105. } else {
  106. trace!("无法开启代理:环境变量获取失败:{:?}", parsing_detail);
  107. false
  108. }
  109. }
  110. pub fn removes_proxy(is_unusual: Option<&str>) -> bool {
  111. //拿到环境变量解析的数据
  112. let parsing_detail = Self::parsing_environment_variables(is_unusual);
  113. if parsing_detail.ip_address.len() > 0 && parsing_detail.port.len() > 0 {
  114. env::remove_var("http_proxy");
  115. env::remove_var("https_proxy");
  116. true
  117. } else {
  118. false
  119. }
  120. }
  121. }