11use crate :: http:: { HttpClient , HttpHeaders , HttpRequestBuilder , HttpResponse } ;
22use fast_pull:: ProgressEntry ;
3+ use httpdate:: parse_http_date;
34use reqwest:: {
45 Client , RequestBuilder , Response ,
56 header:: { self , HeaderMap , HeaderName , InvalidHeaderName } ,
67} ;
8+ use std:: time:: { Duration , SystemTime } ;
79use url:: Url ;
810
911impl HttpClient for Client {
@@ -25,6 +27,23 @@ impl HttpRequestBuilder for RequestBuilder {
2527 type RequestError = reqwest:: Error ;
2628 async fn send ( self ) -> Result < Self :: Response , Self :: RequestError > {
2729 let res = self . send ( ) . await ?;
30+ let retry_after = res. headers ( ) . get ( header:: RETRY_AFTER ) ;
31+ if let Some ( retry_after) = retry_after
32+ && let Ok ( retry_after) = retry_after. to_str ( )
33+ {
34+ let retry_after = match retry_after. parse ( ) {
35+ Ok ( retry_after) => Some ( Duration :: from_secs ( retry_after) ) ,
36+ Err ( _) => match parse_http_date ( retry_after) {
37+ Ok ( target_time) => target_time. duration_since ( SystemTime :: now ( ) ) . ok ( ) ,
38+ Err ( _) => None ,
39+ } ,
40+ } ;
41+ if let Some ( retry_after) = retry_after
42+ && retry_after > Duration :: ZERO
43+ {
44+ tokio:: time:: sleep ( retry_after) . await ;
45+ }
46+ }
2847 res. error_for_status ( )
2948 }
3049}
0 commit comments