@@ -2,6 +2,7 @@ use std::cell::OnceCell;
22
33use serde:: Deserialize ;
44
5+ use crate :: config;
56use crate :: error:: { Error , Result } ;
67
78#[ derive( Debug , Clone ) ]
@@ -46,21 +47,37 @@ impl GitHubUpdateInfo {
4647 }
4748
4849 fn resolve_url ( & self ) -> Result < String > {
49- let api_url = match self . tag . as_str ( ) {
50- "latest" => format ! (
51- "https://api.github.com/repos/{}/{}/releases/latest" ,
52- self . username, self . repo
53- ) ,
54- "latest-pre" | "latest-all" => format ! (
55- "https://api.github.com/repos/{}/{}/releases" ,
56- self . username, self . repo
57- ) ,
50+ let api_path = match self . tag . as_str ( ) {
51+ "latest" => format ! ( "/repos/{}/{}/releases/latest" , self . username, self . repo) ,
52+ "latest-pre" | "latest-all" => {
53+ format ! ( "/repos/{}/{}/releases" , self . username, self . repo)
54+ }
5855 tag => format ! (
59- "https://api.github.com /repos/{}/{}/releases/tags/{}" ,
56+ "/repos/{}/{}/releases/tags/{}" ,
6057 self . username, self . repo, tag
6158 ) ,
6259 } ;
6360
61+ let proxies = config:: get_proxies ( ) ;
62+ let mut last_error = None ;
63+
64+ if proxies. is_empty ( ) {
65+ return self . fetch_release_url ( & api_path, None ) ;
66+ }
67+
68+ for proxy in proxies {
69+ match self . fetch_release_url ( & api_path, Some ( proxy) ) {
70+ Ok ( url) => return Ok ( url) ,
71+ Err ( e) => last_error = Some ( e) ,
72+ }
73+ }
74+
75+ Err ( last_error. unwrap_or_else ( || Error :: GitHubApi ( "All proxies failed" . into ( ) ) ) )
76+ }
77+
78+ fn fetch_release_url ( & self , api_path : & str , proxy : Option < & str > ) -> Result < String > {
79+ let api_url = config:: build_api_url ( api_path, proxy) ;
80+
6481 let response = ureq:: get ( & api_url)
6582 . header ( "User-Agent" , "appimageupdate-rs" )
6683 . call ( )
0 commit comments