@@ -8,10 +8,9 @@ use crate::Error::{
88use crate :: { hasher, matcher, Result } ;
99use async_trait:: async_trait;
1010use futures_util:: StreamExt ;
11- use http:: { header, Extensions } ;
1211use regex:: Regex ;
13- use reqwest:: { Request , Response } ;
14- use reqwest_middleware:: { ClientBuilder , ClientWithMiddleware , Middleware , Next } ;
12+ use reqwest:: header :: HeaderMap ;
13+ use reqwest_middleware:: { ClientBuilder , ClientWithMiddleware } ;
1514use reqwest_retry:: policies:: ExponentialBackoff ;
1615use reqwest_retry:: RetryTransientMiddleware ;
1716use reqwest_tracing:: TracingMiddleware ;
@@ -114,6 +113,7 @@ impl GitHub {
114113 loop {
115114 let request = client
116115 . get ( & self . releases_url )
116+ . headers ( Self :: headers ( ) )
117117 . query ( & [ ( "page" , page. to_string ( ) . as_str ( ) ) , ( "per_page" , "100" ) ] ) ;
118118 let response = request. send ( ) . await ?. error_for_status ( ) ?;
119119 let response_releases = response. json :: < Vec < Release > > ( ) . await ?;
@@ -199,6 +199,20 @@ impl GitHub {
199199
200200 Ok ( ( asset, asset_hash, asset_hasher_fn) )
201201 }
202+
203+ /// Returns the headers for the GitHub request.
204+ fn headers ( ) -> HeaderMap {
205+ let mut headers = HeaderMap :: new ( ) ;
206+ headers. append (
207+ GITHUB_API_VERSION_HEADER ,
208+ GITHUB_API_VERSION . parse ( ) . unwrap ( ) ,
209+ ) ;
210+ headers. append ( "User-Agent" , USER_AGENT . parse ( ) . unwrap ( ) ) ;
211+ if let Some ( token) = & * GITHUB_TOKEN {
212+ headers. append ( "Authorization" , format ! ( "Bearer {token}" ) . parse ( ) . unwrap ( ) ) ;
213+ }
214+ headers
215+ }
202216}
203217
204218#[ async_trait]
@@ -224,7 +238,9 @@ impl Repository for GitHub {
224238
225239 let client = reqwest_client ( ) ;
226240 debug ! ( "Downloading archive {}" , asset. browser_download_url) ;
227- let request = client. get ( & asset. browser_download_url ) ;
241+ let request = client
242+ . get ( & asset. browser_download_url )
243+ . headers ( Self :: headers ( ) ) ;
228244 let response = request. send ( ) . await ?. error_for_status ( ) ?;
229245 #[ cfg( feature = "indicatif" ) ]
230246 let span = tracing:: Span :: current ( ) ;
@@ -257,7 +273,9 @@ impl Repository for GitHub {
257273 "Downloading archive hash {}" ,
258274 asset_hash. browser_download_url
259275 ) ;
260- let request = client. get ( & asset_hash. browser_download_url ) ;
276+ let request = client
277+ . get ( & asset_hash. browser_download_url )
278+ . headers ( Self :: headers ( ) ) ;
261279 let response = request. send ( ) . await ?. error_for_status ( ) ?;
262280 let text = response. text ( ) . await ?;
263281 let re = Regex :: new ( & format ! ( r"[0-9a-f]{{{hash_len}}}" ) ) ?;
@@ -281,51 +299,11 @@ impl Repository for GitHub {
281299 }
282300}
283301
284- /// Middleware to add headers to the request. If a GitHub token is set, then it is added as a
285- /// bearer token. This is used to authenticate with the GitHub API to increase the rate limit.
286- #[ derive( Debug ) ]
287- struct GithubMiddleware ;
288-
289- impl GithubMiddleware {
290- #[ expect( clippy:: unnecessary_wraps) ]
291- fn add_headers ( request : & mut Request ) -> Result < ( ) > {
292- let headers = request. headers_mut ( ) ;
293- headers. append (
294- GITHUB_API_VERSION_HEADER ,
295- GITHUB_API_VERSION . parse ( ) . unwrap ( ) ,
296- ) ;
297- headers. append ( header:: USER_AGENT , USER_AGENT . parse ( ) . unwrap ( ) ) ;
298- if let Some ( token) = & * GITHUB_TOKEN {
299- headers. append (
300- header:: AUTHORIZATION ,
301- format ! ( "Bearer {token}" ) . parse ( ) . unwrap ( ) ,
302- ) ;
303- }
304- Ok ( ( ) )
305- }
306- }
307-
308- #[ async_trait:: async_trait]
309- impl Middleware for GithubMiddleware {
310- async fn handle (
311- & self ,
312- mut request : Request ,
313- extensions : & mut Extensions ,
314- next : Next < ' _ > ,
315- ) -> reqwest_middleware:: Result < Response > {
316- match GithubMiddleware :: add_headers ( & mut request) {
317- Ok ( ( ) ) => next. run ( request, extensions) . await ,
318- Err ( error) => Err ( reqwest_middleware:: Error :: Middleware ( error. into ( ) ) ) ,
319- }
320- }
321- }
322-
323- /// Creates a new reqwest client with middleware for tracing, GitHub, and retrying transient errors.
302+ /// Creates a new reqwest client with middleware for tracing, and retrying transient errors.
324303fn reqwest_client ( ) -> ClientWithMiddleware {
325304 let retry_policy = ExponentialBackoff :: builder ( ) . build_with_max_retries ( 3 ) ;
326305 ClientBuilder :: new ( reqwest:: Client :: new ( ) )
327306 . with ( TracingMiddleware :: default ( ) )
328- . with ( GithubMiddleware )
329307 . with ( RetryTransientMiddleware :: new_with_policy ( retry_policy) )
330308 . build ( )
331309}
0 commit comments