use http::header::{AUTHORIZATION, TRANSFER_ENCODING, USER_AGENT};
use std::borrow::Cow;
use std::time::Duration;
const HEADER_NAME_X_RAY_TRACE_ID: &str = "x-amzn-trace-id";
#[derive(Clone, Debug, PartialEq)]
#[non_exhaustive]
pub struct SigningSettings {
pub percent_encoding_mode: PercentEncodingMode,
pub payload_checksum_kind: PayloadChecksumKind,
pub signature_location: SignatureLocation,
pub expires_in: Option<Duration>,
pub excluded_headers: Option<Vec<Cow<'static, str>>>,
pub uri_path_normalization_mode: UriPathNormalizationMode,
pub session_token_mode: SessionTokenMode,
pub session_token_name_override: Option<&'static str>,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum PayloadChecksumKind {
XAmzSha256,
NoHeader,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum PercentEncodingMode {
Double,
Single,
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum UriPathNormalizationMode {
Enabled,
Disabled,
}
impl From<bool> for UriPathNormalizationMode {
fn from(value: bool) -> Self {
if value {
UriPathNormalizationMode::Enabled
} else {
UriPathNormalizationMode::Disabled
}
}
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SessionTokenMode {
Include,
Exclude,
}
impl Default for SigningSettings {
fn default() -> Self {
let excluded_headers = Some(
[
Cow::Borrowed(AUTHORIZATION.as_str()),
Cow::Borrowed(USER_AGENT.as_str()),
Cow::Borrowed(HEADER_NAME_X_RAY_TRACE_ID),
Cow::Borrowed(TRANSFER_ENCODING.as_str()),
]
.to_vec(),
);
Self {
percent_encoding_mode: PercentEncodingMode::Double,
payload_checksum_kind: PayloadChecksumKind::NoHeader,
signature_location: SignatureLocation::Headers,
expires_in: None,
excluded_headers,
uri_path_normalization_mode: UriPathNormalizationMode::Enabled,
session_token_mode: SessionTokenMode::Include,
session_token_name_override: None,
}
}
}
#[non_exhaustive]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum SignatureLocation {
Headers,
QueryParams,
}