From 22f7de45e8085ca0c0d1517c2b74be72743b1764 Mon Sep 17 00:00:00 2001 From: Psychotoxical Date: Thu, 9 Apr 2026 23:52:02 +0200 Subject: [PATCH] fix(audio): set User-Agent header, add debug fetch logging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set psysonic/ as User-Agent on the audio reqwest::Client to prevent reverse proxies (nginx, Caddy, Traefik) from blocking requests with a 403. Add #[cfg(debug_assertions)] logging in fetch_data to show the exact URL, status, content-type and server header — useful for diagnosing proxy-related 403s reported by users. Co-Authored-By: Claude Sonnet 4.6 --- src-tauri/Cargo.lock | 2 +- src-tauri/src/audio.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 544789c8..975212a5 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3397,7 +3397,7 @@ dependencies = [ [[package]] name = "psysonic" -version = "1.34.6" +version = "1.34.7" dependencies = [ "biquad", "discord-rich-presence", diff --git a/src-tauri/src/audio.rs b/src-tauri/src/audio.rs index 6030dbed..f85cb24d 100644 --- a/src-tauri/src/audio.rs +++ b/src-tauri/src/audio.rs @@ -1684,6 +1684,7 @@ pub fn create_engine() -> (AudioEngine, std::thread::JoinHandle<()>) { http_client: reqwest::Client::builder() .timeout(Duration::from_secs(30)) .use_rustls_tls() + .user_agent(format!("psysonic/{}", env!("CARGO_PKG_VERSION"))) .build() .unwrap_or_default(), eq_gains: Arc::new(std::array::from_fn(|_| AtomicU32::new(0f32.to_bits()))), @@ -1769,6 +1770,24 @@ async fn fetch_data( } let response = state.http_client.get(url).send().await.map_err(|e| e.to_string())?; + #[cfg(debug_assertions)] + { + let status = response.status(); + let ct = response.headers() + .get(reqwest::header::CONTENT_TYPE) + .and_then(|v| v.to_str().ok()) + .unwrap_or("-"); + let server_hdr = response.headers() + .get("server") + .and_then(|v| v.to_str().ok()) + .unwrap_or("-"); + // Strip auth params from URL before logging. + let safe_url = url.split('?').next().unwrap_or(url); + eprintln!( + "[audio] fetch {} → {} | content-type: {} | server: {}", + safe_url, status, ct, server_hdr + ); + } if !response.status().is_success() { if state.generation.load(Ordering::SeqCst) != gen { return Ok(None); // superseded