From 3befdd487453d2d819da24cece180bbf736c07aa Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 11 Jun 2026 16:53:09 +0800 Subject: [PATCH] Rewrite Gitea download/page host to external base in update check Gitea ROOT_URL points to an internal IP, so release/asset URLs returned by the API are not reachable externally. Rewrite their host to the same external base the app queries. Also prefer the .exe (NSIS) asset. Co-Authored-By: Claude Opus 4.8 (1M context) --- src-tauri/src/main.rs | 56 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 87286fb..54f9937 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -78,10 +78,27 @@ fn export_excel(app: tauri::AppHandle, db: State, id: i64) -> Result String { + if url.is_empty() { + return String::new(); + } + match url.find("://") { + Some(scheme) => match url[scheme + 3..].find('/') { + Some(slash) => format!("{GITEA_BASE}{}", &url[scheme + 3 + slash..]), + None => GITEA_BASE.to_string(), + }, + None => url.to_string(), + } +} + #[derive(serde::Serialize)] struct UpdateInfo { current_version: String, @@ -118,16 +135,20 @@ fn check_update(app: tauri::AppHandle) -> Result { .trim_start_matches(['v', 'V']) .to_string(); let notes = json["body"].as_str().unwrap_or_default().to_string(); - let release_url = json["html_url"].as_str().unwrap_or_default().to_string(); + let release_url = rewrite_host(json["html_url"].as_str().unwrap_or_default()); let download_url = json["assets"].as_array().and_then(|assets| { - assets.iter().find_map(|asset| { - let name = asset["name"].as_str().unwrap_or_default().to_ascii_lowercase(); - if name.ends_with(".exe") || name.ends_with(".msi") { - asset["browser_download_url"].as_str().map(str::to_string) - } else { - None - } - }) + // 优先 .exe(NSIS),其次 .msi。 + let pick = |ext: &str| { + assets.iter().find_map(|asset| { + let name = asset["name"].as_str().unwrap_or_default().to_ascii_lowercase(); + if name.ends_with(ext) { + asset["browser_download_url"].as_str() + } else { + None + } + }) + }; + pick(".exe").or_else(|| pick(".msi")).map(rewrite_host) }); Ok(UpdateInfo { @@ -209,7 +230,20 @@ fn main() { #[cfg(test)] mod tests { - use super::is_newer; + use super::{is_newer, rewrite_host, GITEA_BASE}; + + #[test] + fn rewrites_internal_host_to_external() { + assert_eq!( + rewrite_host("http://10.0.11.51:3000/zcdsj/tcjs/releases/download/v0.2.0/app.exe"), + format!("{GITEA_BASE}/zcdsj/tcjs/releases/download/v0.2.0/app.exe") + ); + assert_eq!( + rewrite_host("http://10.0.11.51:3000/zcdsj/tcjs/releases/tag/v0.2.0"), + format!("{GITEA_BASE}/zcdsj/tcjs/releases/tag/v0.2.0") + ); + assert_eq!(rewrite_host(""), ""); + } #[test] fn version_comparison() {