@@ -26,10 +26,12 @@ use crate::configs::connectors::{
2626 ConnectorConfigVersions , ConnectorsConfig , ConnectorsConfigProvider , CreateSinkConfig ,
2727 CreateSourceConfig , SinkConfig , SourceConfig ,
2828} ;
29- use crate :: configs:: runtime:: ResponseConfig ;
29+ use crate :: configs:: runtime:: { ResponseConfig , RetryConfig } ;
3030use crate :: error:: RuntimeError ;
3131use async_trait:: async_trait;
3232use reqwest;
33+ use reqwest_middleware:: { ClientBuilder , ClientWithMiddleware } ;
34+ use reqwest_retry:: { Jitter , RetryTransientMiddleware , policies:: ExponentialBackoff } ;
3335use serde:: { Deserialize , Serialize } ;
3436use std:: collections:: HashMap ;
3537use std:: str:: FromStr ;
@@ -43,7 +45,7 @@ struct SetActiveVersionRequest {
4345pub struct HttpConnectorsConfigProvider {
4446 url_builder : UrlBuilder ,
4547 response_extractor : ResponseExtractor ,
46- client : reqwest :: Client ,
48+ client : ClientWithMiddleware ,
4749}
4850
4951impl HttpConnectorsConfigProvider {
@@ -53,6 +55,7 @@ impl HttpConnectorsConfigProvider {
5355 request_headers : & HashMap < String , String > ,
5456 url_templates : & HashMap < String , String > ,
5557 response_config : & ResponseConfig ,
58+ retry_config : & RetryConfig ,
5659 ) -> Result < Self , RuntimeError > {
5760 let mut headers = reqwest:: header:: HeaderMap :: new ( ) ;
5861 for ( key, value) in request_headers {
@@ -75,13 +78,35 @@ impl HttpConnectorsConfigProvider {
7578 RuntimeError :: InvalidConfiguration ( format ! ( "Failed to build HTTP client: {err}" ) )
7679 } ) ?;
7780
81+ let mut client_with_middleware = ClientBuilder :: new ( client) ;
82+
83+ if retry_config. enabled {
84+ tracing:: trace!( "Apply retry config: {:?}" , retry_config) ;
85+
86+ let retry_policy = ExponentialBackoff :: builder ( )
87+ . retry_bounds (
88+ retry_config. initial_backoff . get_duration ( ) ,
89+ retry_config. max_backoff . get_duration ( ) ,
90+ )
91+ . base ( retry_config. backoff_multiplier )
92+ . jitter ( Jitter :: Bounded )
93+ . build_with_max_retries ( retry_config. max_attempts ) ;
94+
95+ let retry_transient_middleware =
96+ RetryTransientMiddleware :: new_with_policy ( retry_policy) ;
97+
98+ client_with_middleware = client_with_middleware. with ( retry_transient_middleware) ;
99+ }
100+
101+ let final_client = client_with_middleware. build ( ) ;
102+
78103 let url_builder = UrlBuilder :: new ( base_url, url_templates) ;
79104 let response_extractor = ResponseExtractor :: new ( response_config) ;
80105
81106 Ok ( Self {
82107 url_builder,
83108 response_extractor,
84- client,
109+ client : final_client ,
85110 } )
86111 }
87112
0 commit comments