@@ -18,13 +18,16 @@ use http::header::{
1818 InvalidHeaderValue ,
1919 USER_AGENT ,
2020} ;
21- use tracing:: warn;
21+ use tracing:: {
22+ trace,
23+ warn,
24+ } ;
2225
2326/// The environment variable name of additional user agent metadata we include in the user agent
2427/// string. This is used in AWS CloudShell where they want to track usage by version.
2528const AWS_TOOLING_USER_AGENT : & str = "AWS_TOOLING_USER_AGENT" ;
2629
27- const VERSION_HEADER : & str = "Version " ;
30+ const VERSION_HEADER : & str = "appVersion " ;
2831const VERSION_VALUE : & str = env ! ( "CARGO_PKG_VERSION" ) ;
2932
3033#[ derive( Debug ) ]
@@ -91,47 +94,56 @@ impl Intercept for UserAgentOverrideInterceptor {
9194 // Allow for overriding the user agent by an earlier interceptor (so, for example,
9295 // tests can use `AwsUserAgent::for_tests()`) by attempting to grab one out of the
9396 // config bag before creating one.
94- let ua: Cow < ' _ , AwsUserAgent > = cfg. load :: < AwsUserAgent > ( ) . map ( Cow :: Borrowed ) . map_or_else (
95- || {
97+ let ua: Cow < ' _ , AwsUserAgent > = match cfg. get_mut :: < AwsUserAgent > ( ) {
98+ Some ( ua) => {
99+ apply_additional_metadata ( & self . env , ua) ;
100+ Cow :: Borrowed ( ua)
101+ } ,
102+ None => {
96103 let api_metadata = cfg
97104 . load :: < ApiMetadata > ( )
98105 . ok_or ( UserAgentOverrideInterceptorError :: MissingApiMetadata ) ?;
99106
100- let aws_tooling_user_agent = env. get ( AWS_TOOLING_USER_AGENT ) ;
101- let mut ua = AwsUserAgent :: new_from_environment ( env, api_metadata. clone ( ) ) ;
102-
103- let ver = format ! ( "{VERSION_HEADER}/{VERSION_VALUE}" ) ;
104- match AdditionalMetadata :: new ( clean_metadata ( & ver) ) {
105- Ok ( md) => {
106- ua. add_additional_metadata ( md) ;
107- } ,
108- Err ( err) => panic ! ( "Failed to parse version: {err}" ) ,
109- } ;
107+ let mut ua = AwsUserAgent :: new_from_environment ( self . env . clone ( ) , api_metadata. clone ( ) ) ;
110108
111109 let maybe_app_name = cfg. load :: < AppName > ( ) ;
112110 if let Some ( app_name) = maybe_app_name {
113111 ua. set_app_name ( app_name. clone ( ) ) ;
114112 }
115- if let Ok ( val) = aws_tooling_user_agent {
116- match AdditionalMetadata :: new ( clean_metadata ( & val) ) {
117- Ok ( md) => {
118- ua. add_additional_metadata ( md) ;
119- } ,
120- Err ( err) => warn ! ( %err, %val, "Failed to parse {AWS_TOOLING_USER_AGENT}" ) ,
121- } ;
122- }
123113
124- Ok ( Cow :: Owned ( ua) )
114+ apply_additional_metadata ( & env, & mut ua) ;
115+
116+ Cow :: Owned ( ua)
125117 } ,
126- Result :: < _ , UserAgentOverrideInterceptorError > :: Ok ,
127- ) ?;
118+ } ;
119+
120+ trace ! ( ?ua, "setting user agent" ) ;
128121
129122 let headers = context. request_mut ( ) . headers_mut ( ) ;
130123 headers. insert ( USER_AGENT . as_str ( ) , ua. aws_ua_header ( ) ) ;
131124 Ok ( ( ) )
132125 }
133126}
134127
128+ fn apply_additional_metadata ( env : & Env , ua : & mut AwsUserAgent ) {
129+ let ver = format ! ( "{VERSION_HEADER}/{VERSION_VALUE}" ) ;
130+ match AdditionalMetadata :: new ( clean_metadata ( & ver) ) {
131+ Ok ( md) => {
132+ ua. add_additional_metadata ( md) ;
133+ } ,
134+ Err ( err) => panic ! ( "Failed to parse version: {err}" ) ,
135+ } ;
136+
137+ if let Ok ( val) = env. get ( AWS_TOOLING_USER_AGENT ) {
138+ match AdditionalMetadata :: new ( clean_metadata ( & val) ) {
139+ Ok ( md) => {
140+ ua. add_additional_metadata ( md) ;
141+ } ,
142+ Err ( err) => warn ! ( %err, %val, "Failed to parse {AWS_TOOLING_USER_AGENT}" ) ,
143+ } ;
144+ }
145+ }
146+
135147fn clean_metadata ( s : & str ) -> String {
136148 let valid_character = |c : char | -> bool {
137149 match c {
0 commit comments