Unverified Commit 9af2b21e authored by John DiSanti's avatar John DiSanti Committed by GitHub
Browse files

Add compile-time env var to add additional info to user agent header (#3285)

This PR adds a `AWS_SDK_RUST_BUILD_UA_METADATA` environment variable to
allow additional metadata to be added to the SDK user agent header at
compile time.

----

_By submitting this pull request, I confirm that you can use, modify,
copy, and redistribute this contribution, under the terms of your
choice._
parent 04aa4c81
Loading
Loading
Loading
Loading
+56 −29
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ pub struct AwsUserAgent {
    config_metadata: Vec<ConfigMetadata>,
    framework_metadata: Vec<FrameworkMetadata>,
    app_name: Option<AppName>,
    build_env_additional_metadata: Option<AdditionalMetadata>,
}

impl AwsUserAgent {
@@ -49,6 +50,11 @@ impl AwsUserAgent {
            .get("AWS_EXECUTION_ENV")
            .ok()
            .map(|name| ExecEnvMetadata { name });

        // Retrieve additional metadata at compile-time from the AWS_SDK_RUST_BUILD_UA_METADATA env var
        let build_env_additional_metadata = option_env!("AWS_SDK_RUST_BUILD_UA_METADATA")
            .and_then(|value| AdditionalMetadata::new(value).ok());

        AwsUserAgent {
            sdk_metadata,
            api_metadata,
@@ -63,6 +69,7 @@ impl AwsUserAgent {
            config_metadata: Default::default(),
            framework_metadata: Default::default(),
            app_name: Default::default(),
            build_env_additional_metadata,
        }
    }

@@ -93,6 +100,7 @@ impl AwsUserAgent {
            config_metadata: Vec::new(),
            framework_metadata: Vec::new(),
            app_name: None,
            build_env_additional_metadata: None,
        }
    }

@@ -188,6 +196,9 @@ impl AwsUserAgent {
        if let Some(app_name) = &self.app_name {
            write!(ua_value, "app/{}", app_name).unwrap();
        }
        if let Some(additional_metadata) = &self.build_env_additional_metadata {
            write!(ua_value, "{}", additional_metadata).unwrap();
        }
        if ua_value.ends_with(' ') {
            ua_value.truncate(ua_value.len() - 1);
        }
@@ -662,6 +673,20 @@ mod test {
            "aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0"
        );
    }

    #[test]
    fn generate_a_valid_ua_with_build_env_additional_metadata() {
        let mut ua = AwsUserAgent::for_tests();
        ua.build_env_additional_metadata = Some(AdditionalMetadata::new("asdf").unwrap());
        assert_eq!(
            ua.aws_ua_header(),
            "aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 md/asdf"
        );
        assert_eq!(
            ua.ua_header(),
            "aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0"
        );
    }
}

/*
@@ -685,7 +710,8 @@ env-metadata = "exec-env/" name
feat-metadata                 = "ft/" name ["/" version] *(RWS additional-metadata)
config-metadata               = "cfg/" config ["/" value]
framework-metadata            = "lib/" name ["/" version] *(RWS additional-metadata)
appId                = "app/" name
app-id                        = "app/" name
build-env-additional-metadata = "md/" value
ua-string                     = sdk-metadata RWS
                                [api-metadata RWS]
                                os-metadata RWS
@@ -694,7 +720,8 @@ ua-string = sdk-metadata RWS
                                *(feat-metadata RWS)
                                *(config-metadata RWS)
                                *(framework-metadata RWS)
                       [appId]
                                [app-id]
                                [build-env-additional-metadata]

# New metadata field might be added in the future and they must follow this format
prefix               = token