@@ -88,29 +88,40 @@ impl RetryConfig<No429RetryStrategy> {
8888 }
8989}
9090
91- fn reqwest_client ( ) -> Result < reqwest:: Client , CasClientError > {
91+ fn reqwest_client ( user_agent : & str ) -> Result < reqwest:: Client , CasClientError > {
9292 // custom dns resolver not supported in WASM. no access to getaddrinfo/any other dns interface.
9393 #[ cfg( target_family = "wasm" ) ]
9494 {
95- static CLIENT : std:: sync:: LazyLock < reqwest:: Client > = std:: sync:: LazyLock :: new ( || reqwest:: Client :: new ( ) ) ;
96- Ok ( ( & * CLIENT ) . clone ( ) )
95+ // For WASM, create a new client with the specified user_agent
96+ // Note: we could cache this, but user_agent can vary, so we create per-call
97+ let mut builder = reqwest:: Client :: builder ( ) ;
98+ if !user_agent. is_empty ( ) {
99+ builder = builder. user_agent ( user_agent) ;
100+ }
101+ Ok ( builder. build ( ) ?)
97102 }
98103
99104 #[ cfg( not( target_family = "wasm" ) ) ]
100105 {
101106 use xet_runtime:: XetRuntime ;
102107
103108 let client = XetRuntime :: get_or_create_reqwest_client ( || {
104- reqwest:: Client :: builder ( )
109+ let mut builder = reqwest:: Client :: builder ( )
105110 . pool_idle_timeout ( * CLIENT_IDLE_CONNECTION_TIMEOUT )
106111 . pool_max_idle_per_host ( * CLIENT_MAX_IDLE_CONNECTIONS )
107- . http1_only ( ) // high throughput parallel I/O has been shown to bottleneck with http2
108- . build ( )
112+ . http1_only ( ) ; // high throughput parallel I/O has been shown to bottleneck with http2
113+
114+ if !user_agent. is_empty ( ) {
115+ builder = builder. user_agent ( user_agent) ;
116+ }
117+
118+ builder. build ( )
109119 } ) ?;
110120
111121 info ! (
112122 idle_timeout=?* CLIENT_IDLE_CONNECTION_TIMEOUT ,
113123 max_idle_connections=* CLIENT_MAX_IDLE_CONNECTIONS ,
124+ user_agent=?if user_agent. is_empty( ) { None } else { Some ( user_agent) } ,
114125 "HTTP client configured"
115126 ) ;
116127
@@ -124,12 +135,13 @@ pub fn build_auth_http_client<R: RetryableStrategy + Send + Sync + 'static>(
124135 auth_config : & Option < AuthConfig > ,
125136 retry_config : RetryConfig < R > ,
126137 session_id : & str ,
138+ user_agent : & str ,
127139) -> Result < ClientWithMiddleware , CasClientError > {
128140 let auth_middleware = auth_config. as_ref ( ) . map ( AuthMiddleware :: from) ;
129141 let logging_middleware = Some ( LoggingMiddleware ) ;
130142 let session_middleware = ( !session_id. is_empty ( ) ) . then ( || SessionMiddleware ( session_id. to_owned ( ) ) ) ;
131143
132- let client = ClientBuilder :: new ( reqwest_client ( ) ?)
144+ let client = ClientBuilder :: new ( reqwest_client ( user_agent ) ?)
133145 . maybe_with ( auth_middleware)
134146 . with ( get_retry_middleware ( retry_config) )
135147 . maybe_with ( logging_middleware)
@@ -142,11 +154,12 @@ pub fn build_auth_http_client<R: RetryableStrategy + Send + Sync + 'static>(
142154pub fn build_auth_http_client_no_retry (
143155 auth_config : & Option < AuthConfig > ,
144156 session_id : & str ,
157+ user_agent : & str ,
145158) -> Result < ClientWithMiddleware , CasClientError > {
146159 let auth_middleware = auth_config. as_ref ( ) . map ( AuthMiddleware :: from) . info_none ( "CAS auth disabled" ) ;
147160 let logging_middleware = Some ( LoggingMiddleware ) ;
148161 let session_middleware = ( !session_id. is_empty ( ) ) . then ( || SessionMiddleware ( session_id. to_owned ( ) ) ) ;
149- Ok ( ClientBuilder :: new ( reqwest_client ( ) ?)
162+ Ok ( ClientBuilder :: new ( reqwest_client ( user_agent ) ?)
150163 . maybe_with ( auth_middleware)
151164 . maybe_with ( logging_middleware)
152165 . maybe_with ( session_middleware)
@@ -158,14 +171,15 @@ pub fn build_auth_http_client_no_retry(
158171pub fn build_http_client < R : RetryableStrategy + Send + Sync + ' static > (
159172 retry_config : RetryConfig < R > ,
160173 session_id : & str ,
174+ user_agent : & str ,
161175) -> Result < ClientWithMiddleware , CasClientError > {
162- build_auth_http_client ( & None , retry_config, session_id)
176+ build_auth_http_client ( & None , retry_config, session_id, user_agent )
163177}
164178
165179/// Builds HTTP Client to talk to CAS.
166180/// Includes retry middleware with exponential backoff.
167- pub fn build_http_client_no_retry ( session_id : & str ) -> Result < ClientWithMiddleware , CasClientError > {
168- build_auth_http_client_no_retry ( & None , session_id)
181+ pub fn build_http_client_no_retry ( session_id : & str , user_agent : & str ) -> Result < ClientWithMiddleware , CasClientError > {
182+ build_auth_http_client_no_retry ( & None , session_id, user_agent )
169183}
170184
171185/// RetryStrategy
@@ -386,7 +400,7 @@ mod tests {
386400 max_retry_interval_ms : 3000 ,
387401 strategy : DefaultRetryableStrategy ,
388402 } ;
389- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
403+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
390404
391405 // Act & Assert - should retry and log
392406 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -412,7 +426,7 @@ mod tests {
412426 max_retry_interval_ms : 3000 ,
413427 strategy : No429RetryStrategy ,
414428 } ;
415- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
429+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
416430
417431 // Act & Assert - should retry and log
418432 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -442,7 +456,7 @@ mod tests {
442456 max_retry_interval_ms : 3000 ,
443457 strategy : DefaultRetryableStrategy ,
444458 } ;
445- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
459+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
446460
447461 // Act & Assert - should retry and log
448462 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -468,7 +482,7 @@ mod tests {
468482 max_retry_interval_ms : 3000 ,
469483 strategy : No429RetryStrategy ,
470484 } ;
471- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
485+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
472486
473487 // Act & Assert - should retry and log
474488 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -499,7 +513,7 @@ mod tests {
499513 max_retry_interval_ms : 6000 ,
500514 strategy : DefaultRetryableStrategy ,
501515 } ;
502- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
516+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
503517
504518 // Act & Assert - should retry and log
505519 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -527,7 +541,7 @@ mod tests {
527541 max_retry_interval_ms : 6000 ,
528542 strategy : No429RetryStrategy ,
529543 } ;
530- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
544+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
531545
532546 // Act & Assert - should retry and log
533547 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
@@ -557,7 +571,7 @@ mod tests {
557571 max_retry_interval_ms : 6000 ,
558572 strategy : No429RetryStrategy ,
559573 } ;
560- let client = build_auth_http_client ( & None , retry_config, "" ) . unwrap ( ) ;
574+ let client = build_auth_http_client ( & None , retry_config, "" , "" ) . unwrap ( ) ;
561575
562576 // Act & Assert - should retry and log
563577 let response = client. get ( server. url ( "/data" ) ) . send ( ) . await . unwrap ( ) ;
0 commit comments