Unverified Commit ae4c091f authored by Yilin Guo's avatar Yilin Guo Committed by GitHub
Browse files

Add AdditionalMetadata to AwsUserAgent struct (#750)

* Add AdditionalMetadata to AwsUserAgent struct

* Make addtional_metadata a vec
parent 275baef7
Loading
Loading
Loading
Loading
+59 −2
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ pub struct AwsUserAgent {
    os_metadata: OsMetadata,
    language_metadata: LanguageMetadata,
    exec_env_metadata: Option<ExecEnvMetadata>,
    additional_metadata: Vec<AdditionalMetadata>,
}

impl AwsUserAgent {
@@ -54,6 +55,7 @@ impl AwsUserAgent {
                extras: vec![],
            },
            exec_env_metadata: None,
            additional_metadata: vec![],
        }
    }

@@ -80,6 +82,7 @@ impl AwsUserAgent {
                extras: vec![],
            },
            exec_env_metadata: None,
            additional_metadata: vec![],
        }
    }

@@ -129,8 +132,15 @@ impl AwsUserAgent {
        write!(ua_value, "{} ", &self.sdk_metadata).unwrap();
        write!(ua_value, "{} ", &self.os_metadata).unwrap();
        write!(ua_value, "{}", &self.language_metadata).unwrap();
        for metadata in &self.additional_metadata {
            write!(ua_value, " {}", metadata).unwrap();
        }
        ua_value
    }

    pub fn add_metadata(&mut self, additional_metadata: AdditionalMetadata) {
        self.additional_metadata.push(additional_metadata);
    }
}

#[derive(Clone, Copy)]
@@ -167,11 +177,23 @@ impl Display for ApiMetadata {
}

#[derive(Clone)]
struct AdditionalMetadata {
pub struct AdditionalMetadata {
    key: String,
    value: String,
}

impl AdditionalMetadata {
    pub const fn new(key: String, value: String) -> Self {
        Self { key, value }
    }
}

impl Display for AdditionalMetadata {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "{}/{}", &self.key, &self.value)
    }
}

#[derive(Clone)]
struct OsMetadata {
    os_family: &'static OsFamily,
@@ -269,7 +291,7 @@ impl MapRequest for UserAgentStage {
#[cfg(test)]
mod test {
    use crate::user_agent::X_AMZ_USER_AGENT;
    use crate::user_agent::{ApiMetadata, AwsUserAgent, UserAgentStage};
    use crate::user_agent::{AdditionalMetadata, ApiMetadata, AwsUserAgent, UserAgentStage};
    use aws_types::build_metadata::OsFamily;
    use http::header::USER_AGENT;
    use smithy_http::body::SdkBody;
@@ -298,6 +320,41 @@ mod test {
        );
    }

    #[test]
    fn generate_a_valid_ua_with_additional_metadata() {
        let api_metadata = ApiMetadata {
            service_id: "dynamodb".into(),
            version: "123",
        };
        let mut ua = AwsUserAgent::new_from_environment(api_metadata);
        ua.sdk_metadata.version = "0.1";
        ua.language_metadata.version = "1.50.0";
        ua.os_metadata.os_family = &OsFamily::Macos;
        ua.os_metadata.version = Some("1.15".to_string());
        let additional_metadata_0 = AdditionalMetadata {
            key: "key_0".to_string(),
            value: "val_0".to_string(),
        };
        ua.add_metadata(additional_metadata_0);
        assert_eq!(
            ua.aws_ua_header(),
            "aws-sdk-rust/0.1 api/dynamodb/123 os/macos/1.15 lang/rust/1.50.0"
        );
        assert_eq!(
            ua.ua_header(),
            "aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0 key_0/val_0"
        );
        let additional_metadata_1 = AdditionalMetadata {
            key: "key_1".to_string(),
            value: "val_1".to_string(),
        };
        ua.add_metadata(additional_metadata_1);
        assert_eq!(
            ua.ua_header(),
            "aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0 key_0/val_0 key_1/val_1"
        );
    }

    #[test]
    fn ua_stage_adds_headers() {
        let stage = UserAgentStage::new();