@@ -98,7 +98,7 @@ impl EnvironmentManager {
9898 let provider = self
9999 . providers
100100 . get ( language)
101- . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issus " , language) ) ?;
101+ . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issues " , language) ) ?;
102102
103103 info ! ( "获取 {} 环境信息" , language) ;
104104
@@ -126,7 +126,7 @@ impl EnvironmentManager {
126126 let provider = self
127127 . providers
128128 . get ( language)
129- . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issus " , language) ) ?;
129+ . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issues " , language) ) ?;
130130
131131 info ! ( "开始下载并安装 {} 版本 {}" , language, version) ;
132132 provider. download_and_install ( version, app_handle) . await
@@ -136,7 +136,7 @@ impl EnvironmentManager {
136136 let provider = self
137137 . providers
138138 . get ( language)
139- . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issus " , language) ) ?;
139+ . ok_or_else ( || format ! ( "暂未支持 {} 语言,请前往 github 提供 issues " , language) ) ?;
140140
141141 info ! ( "切换 {} 到版本 {}" , language, version) ;
142142 provider. switch_version ( version) . await
@@ -175,3 +175,84 @@ pub fn emit_download_progress(
175175 error ! ( "发送下载进度事件失败: {}" , e) ;
176176 }
177177}
178+
179+ // 将 GitHub 下载 URL 转换为 CDN 镜像 URL
180+ pub fn convert_to_cdn_url (
181+ original_url : & str ,
182+ language : & str ,
183+ version : & str ,
184+ ) -> Result < String , String > {
185+ use crate :: config:: get_app_config_internal;
186+
187+ let config = get_app_config_internal ( ) . map_err ( |e| format ! ( "获取配置失败: {}" , e) ) ?;
188+
189+ let mirror_config = config. environment_mirror . as_ref ( ) ;
190+ let enabled = mirror_config. and_then ( |m| m. enabled ) . unwrap_or ( false ) ;
191+
192+ if !enabled {
193+ return Ok ( original_url. to_string ( ) ) ;
194+ }
195+
196+ let base_url = mirror_config
197+ . and_then ( |m| m. base_url . as_ref ( ) )
198+ . ok_or_else ( || "CDN 基础 URL 未配置" . to_string ( ) ) ?;
199+
200+ // 从原始 URL 中提取文件名
201+ let file_name = original_url
202+ . split ( '/' )
203+ . last ( )
204+ . ok_or_else ( || "无效的下载 URL" . to_string ( ) ) ?;
205+
206+ // 构建 CDN URL: {base_url}/{language}/{version}/{filename}
207+ let cdn_url = format ! (
208+ "{}/{}/{}/{}" ,
209+ base_url. trim_end_matches( '/' ) ,
210+ language,
211+ version,
212+ file_name
213+ ) ;
214+
215+ info ! ( "转换下载 URL: {} -> {}" , original_url, cdn_url) ;
216+ Ok ( cdn_url)
217+ }
218+
219+ // 尝试从 CDN 下载,失败则回退到原始 URL
220+ pub async fn download_with_fallback (
221+ client : & reqwest:: Client ,
222+ original_url : & str ,
223+ language : & str ,
224+ version : & str ,
225+ ) -> Result < reqwest:: Response , String > {
226+ // 首先尝试从 CDN 下载
227+ match convert_to_cdn_url ( original_url, language, version) {
228+ Ok ( cdn_url) if cdn_url != original_url => {
229+ info ! ( "尝试从 CDN 下载: {}" , cdn_url) ;
230+ match client. get ( & cdn_url) . send ( ) . await {
231+ Ok ( response) if response. status ( ) . is_success ( ) => {
232+ info ! ( "CDN 下载成功" ) ;
233+ return Ok ( response) ;
234+ }
235+ Ok ( response) => {
236+ info ! ( "CDN 下载失败 (HTTP {}), 回退到原始 URL" , response. status( ) ) ;
237+ }
238+ Err ( e) => {
239+ info ! ( "CDN 下载失败 ({}), 回退到原始 URL" , e) ;
240+ }
241+ }
242+ }
243+ Ok ( _) => {
244+ info ! ( "CDN 镜像未启用,使用原始 URL" ) ;
245+ }
246+ Err ( e) => {
247+ info ! ( "CDN URL 转换失败 ({}), 使用原始 URL" , e) ;
248+ }
249+ }
250+
251+ // 回退到原始 URL
252+ info ! ( "从原始 URL 下载: {}" , original_url) ;
253+ client
254+ . get ( original_url)
255+ . send ( )
256+ . await
257+ . map_err ( |e| format ! ( "下载失败: {}" , e) )
258+ }
0 commit comments