Skip to main content

aws_sdk_directory/
serialization_settings.rs

1// Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.
2/*
3 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#![allow(dead_code)]
8
9use aws_smithy_http::header::set_request_header_if_absent;
10use aws_smithy_types::config_bag::{Storable, StoreReplace};
11use http_1x::header::{HeaderName, CONTENT_LENGTH, CONTENT_TYPE};
12
13/// Configuration for how default protocol headers are serialized
14#[derive(Clone, Debug, Default)]
15pub(crate) struct HeaderSerializationSettings {
16    omit_default_content_length: bool,
17    omit_default_content_type: bool,
18}
19
20impl HeaderSerializationSettings {
21    /// Creates new [`HeaderSerializationSettings`]
22    pub(crate) fn new() -> Self {
23        Default::default()
24    }
25
26    /// Omit the default `Content-Length` header during serialization
27    pub(crate) fn omit_default_content_length(self) -> Self {
28        Self {
29            omit_default_content_length: true,
30            ..self
31        }
32    }
33
34    /// Omit the default `Content-Type` header during serialization
35    pub(crate) fn omit_default_content_type(self) -> Self {
36        Self {
37            omit_default_content_type: true,
38            ..self
39        }
40    }
41
42    /// Returns true if the given default header name should be serialized
43    fn include_header(&self, header: &HeaderName) -> bool {
44        (!self.omit_default_content_length || header != CONTENT_LENGTH) && (!self.omit_default_content_type || header != CONTENT_TYPE)
45    }
46
47    /// Sets a default header on the given request builder if it should be serialized
48    pub(crate) fn set_default_header(
49        &self,
50        mut request: http_1x::request::Builder,
51        header_name: HeaderName,
52        value: &str,
53    ) -> http_1x::request::Builder {
54        if self.include_header(&header_name) {
55            request = set_request_header_if_absent(request, header_name, value);
56        }
57        request
58    }
59}
60
61impl Storable for HeaderSerializationSettings {
62    type Storer = StoreReplace<Self>;
63}
64
65#[cfg(test)]
66mod tests {
67    use super::*;
68
69    #[test]
70    fn test_include_header() {
71        let settings = HeaderSerializationSettings::default();
72        assert!(settings.include_header(&CONTENT_LENGTH));
73        assert!(settings.include_header(&CONTENT_TYPE));
74
75        let settings = HeaderSerializationSettings::default().omit_default_content_length();
76        assert!(!settings.include_header(&CONTENT_LENGTH));
77        assert!(settings.include_header(&CONTENT_TYPE));
78
79        let settings = HeaderSerializationSettings::default().omit_default_content_type();
80        assert!(settings.include_header(&CONTENT_LENGTH));
81        assert!(!settings.include_header(&CONTENT_TYPE));
82
83        let settings = HeaderSerializationSettings::default()
84            .omit_default_content_type()
85            .omit_default_content_length();
86        assert!(!settings.include_header(&CONTENT_LENGTH));
87        assert!(!settings.include_header(&CONTENT_TYPE));
88    }
89}