@@ -18,13 +18,16 @@ use http::header::{
18
18
InvalidHeaderValue ,
19
19
USER_AGENT ,
20
20
} ;
21
- use tracing:: warn;
21
+ use tracing:: {
22
+ trace,
23
+ warn,
24
+ } ;
22
25
23
26
/// The environment variable name of additional user agent metadata we include in the user agent
24
27
/// string. This is used in AWS CloudShell where they want to track usage by version.
25
28
const AWS_TOOLING_USER_AGENT : & str = "AWS_TOOLING_USER_AGENT" ;
26
29
27
- const VERSION_HEADER : & str = "Version " ;
30
+ const VERSION_HEADER : & str = "appVersion " ;
28
31
const VERSION_VALUE : & str = env ! ( "CARGO_PKG_VERSION" ) ;
29
32
30
33
#[ derive( Debug ) ]
@@ -91,47 +94,56 @@ impl Intercept for UserAgentOverrideInterceptor {
91
94
// Allow for overriding the user agent by an earlier interceptor (so, for example,
92
95
// tests can use `AwsUserAgent::for_tests()`) by attempting to grab one out of the
93
96
// 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 => {
96
103
let api_metadata = cfg
97
104
. load :: < ApiMetadata > ( )
98
105
. ok_or ( UserAgentOverrideInterceptorError :: MissingApiMetadata ) ?;
99
106
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 ( ) ) ;
110
108
111
109
let maybe_app_name = cfg. load :: < AppName > ( ) ;
112
110
if let Some ( app_name) = maybe_app_name {
113
111
ua. set_app_name ( app_name. clone ( ) ) ;
114
112
}
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
- }
123
113
124
- Ok ( Cow :: Owned ( ua) )
114
+ apply_additional_metadata ( & env, & mut ua) ;
115
+
116
+ Cow :: Owned ( ua)
125
117
} ,
126
- Result :: < _ , UserAgentOverrideInterceptorError > :: Ok ,
127
- ) ?;
118
+ } ;
119
+
120
+ trace ! ( ?ua, "setting user agent" ) ;
128
121
129
122
let headers = context. request_mut ( ) . headers_mut ( ) ;
130
123
headers. insert ( USER_AGENT . as_str ( ) , ua. aws_ua_header ( ) ) ;
131
124
Ok ( ( ) )
132
125
}
133
126
}
134
127
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
+
135
147
fn clean_metadata ( s : & str ) -> String {
136
148
let valid_character = |c : char | -> bool {
137
149
match c {
0 commit comments