diff --git a/Cargo.toml b/Cargo.toml index bd414cf..1473be1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ notify-rust = { version = "4.11.7", optional = true } gdk-pixbuf = { version = "0.3.0", optional = true } # DO NOT UPDATE winapi = { version = "0.3.9", optional = true, features = ["wincon", "winuser"] } tungstenite = "0.27.0" -reqwest = { version = "0.12.20", features = ["blocking"] } +reqwest = { version = "0.12.20", features = ["blocking", "socks"] } libadwaita = { version = "0.8.0", optional = true, features = ["v1_6"] } [build-dependencies] diff --git a/src/chat/gui.rs b/src/chat/gui.rs index a4a1cd6..0e251a4 100644 --- a/src/chat/gui.rs +++ b/src/chat/gui.rs @@ -971,7 +971,7 @@ fn setup(_: &Application, ctx: Arc, ui: UiModel) { let Some(avatar_url) = grab_avatar(message) else { continue }; let avatar_id = get_avatar_id(&avatar_url); - let Some(avatar) = load_avatar(&avatar_url, ctx.config(|o| o.max_avatar_size as usize)) else { println!("cant load avatar: {avatar_url} request error"); continue }; + let Some(avatar) = load_avatar(&avatar_url, ctx.config(|o| o.proxy.clone()), ctx.config(|o| o.max_avatar_size as usize)) else { println!("cant load avatar: {avatar_url} request error"); continue }; let Ok(pixbuf) = load_pixbuf(&avatar) else { println!("cant load avatar: {avatar_url} pixbuf error"); continue; }; let Some(pixbuf) = pixbuf.scale_simple(32, 32, InterpType::Bilinear) else { println!("cant load avatar: {avatar_url} scale image error"); continue }; let texture = Texture::for_pixbuf(&pixbuf); @@ -1178,8 +1178,22 @@ fn get_avatar_id(url: &str) -> u64 { hasher.finish() } -fn load_avatar(url: &str, response_limit: usize) -> Option> { - reqwest::blocking::get(url).ok() +fn load_avatar(url: &str, proxy: Option, response_limit: usize) -> Option> { + let client = if let Some(proxy) = proxy { + let proxy = if proxy.starts_with("socks5://") { + proxy + } else { + format!("socks5://{proxy}") + }; + + reqwest::blocking::Client::builder() + .proxy(reqwest::Proxy::all(&proxy).ok()?) + .build().ok()? + } else { + reqwest::blocking::Client::new() + }; + + client.get(url).send().ok() .and_then(|mut resp| { let mut data = Vec::new(); let mut length = 0;