1use serde::{Serialize, Deserialize};
2use log::*;
3
4use crate::get_proxy_password_var;
5
6#[derive(Serialize, Deserialize, Debug, Clone)]
8pub struct Proxy {
9 pub url: String,
10 pub port: i32,
11 pub user: Option<String>,
12 pub password: Option<String>,
13}
14
15impl Proxy {
16 fn get_env_var(name:&str) -> Option<String> {
17 match std::env::var(name) {
18 Ok(pp) => Some(pp),
19 Err(_) => None
20 }
21 }
22 fn get_user_var() -> &'static str {
23 let os = std::env::consts::OS;
24 if os == "windows" {
25 "USERNAME"
26 } else {
27 "USER"
28 }
29 }
30 pub fn get_user(&self) -> Option<String> {
32 if let Some(user) = &self.user {
33 Some(user.to_owned())
34 } else if let Some(euser) = Proxy::get_env_var(Proxy::get_user_var()) {
35 Some(euser)
36 } else {
37 None
38 }
39 }
40 pub fn get_password(&self) -> Option<String> {
42 if let Some(pass) = &self.password {
43 Some(pass.to_owned())
44 } else if let Some(epass) = Proxy::get_env_var(&get_proxy_password_var()) {
45 Some(epass)
46 } else {
47 None
48 }
49 }
50 pub fn get_url(&self) -> String {
52 let mut url = self.url.to_owned();
53 if let Some(user) = self.get_user() {
54 if let Some(pass) = self.get_password() {
55 let parts:Vec<&str> = url.split("://").collect();
56 let def_proto = format!("http://");
57 let mut proto = def_proto.as_str();
58 let host = if parts.len() == 1 {
59 &url
60 } else {
61 proto = parts[0];
62 parts[1]
63 };
64 url = format!("{}{}:{}@{}:{}",
65 proto,
66 user,
67 pass,
68 host,
69 self.port);
70 }
71 debug!("proxy url [{url}]");
72 }
73 url
74 }
75}
76
77#[derive(Serialize, Deserialize, Debug, Clone)]
79pub struct Network {
80 pub proxy: Option<Proxy>,
81 pub skip_ssl_validation: Option<bool>,
82}
83
84impl Network {
85 pub fn skip_ssl_validation(&self) -> bool {
87 if let Some(ssv) = self.skip_ssl_validation {
88 ssv
89 } else {
90 false
91 }
92 }
93}