@@ -45,6 +45,46 @@ impl Service {
4545 path,
4646 }
4747 }
48+
49+ /// Build a reqwest request for an asset, handling private/public repos and method.
50+ fn build_request (
51+ gh : & GitHub ,
52+ asset : & Asset ,
53+ client : & Client ,
54+ method : & Method ,
55+ ) -> reqwest:: RequestBuilder {
56+ let url = if gh. is_private ( ) {
57+ format ! (
58+ "https://api.github.com/repos/{}/{}/releases/assets/{}" ,
59+ gh. owner( ) ,
60+ gh. repo( ) ,
61+ asset. id
62+ )
63+ } else {
64+ asset. url . clone ( )
65+ } ;
66+
67+ let rb = match method {
68+ & Method :: HEAD => client. head ( url) ,
69+ _ => client. get ( url) , // fallback; you only use HEAD/GET here
70+ } ;
71+
72+ if gh. is_private ( ) {
73+ // Required by GitHub asset API for private repos
74+ rb. header ( "Accept" , "application/octet-stream" )
75+ } else {
76+ rb
77+ }
78+ }
79+
80+ fn inspect_response ( response : & reqwest:: Response ) -> ( reqwest:: StatusCode , Option < & str > ) {
81+ let status_code = response. status ( ) ;
82+ let content_length = response
83+ . headers ( )
84+ . get ( "content-length" )
85+ . and_then ( |v| v. to_str ( ) . ok ( ) ) ;
86+ ( status_code, content_length)
87+ }
4888}
4989
5090impl hyper:: service:: Service < Request < Incoming > > for Service {
@@ -110,7 +150,21 @@ impl hyper::service::Service<Request<Incoming>> for Service {
110150 None => return Ok ( POWEROFF_EFI . reply ( None , Type :: Efi , EMPTY ) ) ,
111151
112152 // Send the request (possibly redirecting...)
113- Some ( asset) => ( client. head ( asset. url ) . send ( ) . await ?, asset. mime ) ,
153+ Some ( asset) => {
154+ let request =
155+ Self :: build_request ( & github, & asset, & client, & Method :: HEAD ) ;
156+
157+ match request. send ( ) . await {
158+ Ok ( resp) => {
159+ let ( _status_code, _content_length) =
160+ Self :: inspect_response ( & resp) ;
161+ ( resp, asset. mime )
162+ }
163+ Err ( _e) => {
164+ return Ok ( EMPTY . reply ( Code :: BAD_GATEWAY , None , None ) ) ;
165+ }
166+ }
167+ }
114168 }
115169 }
116170
@@ -122,9 +176,20 @@ impl hyper::service::Service<Request<Incoming>> for Service {
122176
123177 // Send the request (possibly redirecting...)
124178 Some ( asset) => {
125- let response = client. get ( asset. url ) . send ( ) . await ?;
126- status. lock ( ) . await . update ( ) . downloading ( remote) ;
127- ( response, asset. mime )
179+ let request =
180+ Self :: build_request ( & github, & asset, & client, & Method :: GET ) ;
181+
182+ match request. send ( ) . await {
183+ Ok ( resp) => {
184+ let ( _status_code, _content_length) =
185+ Self :: inspect_response ( & resp) ;
186+ status. lock ( ) . await . update ( ) . downloading ( remote) ;
187+ ( resp, asset. mime )
188+ }
189+ Err ( _e) => {
190+ return Ok ( EMPTY . reply ( Code :: BAD_GATEWAY , None , None ) ) ;
191+ }
192+ }
128193 }
129194 }
130195 }
0 commit comments