mod canonical_request;
mod error;
mod settings;
mod sign;
mod uri_path_normalization;
mod url_escape;
#[cfg(test)]
pub(crate) mod test;
use crate::sign::v4;
#[cfg(feature = "sigv4a")]
use crate::sign::v4a;
use crate::SignatureVersion;
use aws_credential_types::Credentials;
pub use error::SigningError;
pub use settings::{
PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningSettings,
UriPathNormalizationMode,
};
pub use sign::{sign, SignableBody, SignableRequest, SigningInstructions};
use std::time::SystemTime;
#[derive(Debug)]
#[non_exhaustive]
pub enum SigningParams<'a> {
V4(v4::SigningParams<'a, SigningSettings>),
#[cfg(feature = "sigv4a")]
V4a(v4a::SigningParams<'a, SigningSettings>),
}
impl<'a> From<v4::SigningParams<'a, SigningSettings>> for SigningParams<'a> {
fn from(value: v4::SigningParams<'a, SigningSettings>) -> Self {
Self::V4(value)
}
}
#[cfg(feature = "sigv4a")]
impl<'a> From<v4a::SigningParams<'a, SigningSettings>> for SigningParams<'a> {
fn from(value: v4a::SigningParams<'a, SigningSettings>) -> Self {
Self::V4a(value)
}
}
impl SigningParams<'_> {
pub(crate) fn credentials(&self) -> Result<&Credentials, SigningError> {
let identity = match self {
Self::V4(v4::SigningParams { identity, .. }) => identity,
#[cfg(feature = "sigv4a")]
Self::V4a(v4a::SigningParams { identity, .. }) => identity,
};
identity
.data::<Credentials>()
.ok_or_else(SigningError::unsupported_identity_type)
}
pub fn region(&self) -> Option<&str> {
match self {
SigningParams::V4(v4::SigningParams { region, .. }) => Some(region),
#[allow(unreachable_patterns)]
_ => None,
}
}
#[cfg(feature = "sigv4a")]
pub fn region_set(&self) -> Option<&str> {
match self {
SigningParams::V4a(v4a::SigningParams { region_set, .. }) => Some(region_set),
_ => None,
}
}
pub fn settings(&self) -> &SigningSettings {
match self {
Self::V4(v4::SigningParams { settings, .. }) => settings,
#[cfg(feature = "sigv4a")]
Self::V4a(v4a::SigningParams { settings, .. }) => settings,
}
}
pub fn settings_mut(&mut self) -> &mut SigningSettings {
match self {
Self::V4(v4::SigningParams { settings, .. }) => settings,
#[cfg(feature = "sigv4a")]
Self::V4a(v4a::SigningParams { settings, .. }) => settings,
}
}
#[cfg(test)]
pub fn set_payload_checksum_kind(&mut self, kind: PayloadChecksumKind) {
let settings = self.settings_mut();
settings.payload_checksum_kind = kind;
}
#[cfg(test)]
pub fn set_session_token_mode(&mut self, mode: SessionTokenMode) {
let settings = self.settings_mut();
settings.session_token_mode = mode;
}
pub fn time(&self) -> &SystemTime {
match self {
Self::V4(v4::SigningParams { time, .. }) => time,
#[cfg(feature = "sigv4a")]
Self::V4a(v4a::SigningParams { time, .. }) => time,
}
}
pub fn name(&self) -> &str {
match self {
Self::V4(v4::SigningParams { name, .. }) => name,
#[cfg(feature = "sigv4a")]
Self::V4a(v4a::SigningParams { name, .. }) => name,
}
}
pub fn algorithm(&self) -> &'static str {
match self {
Self::V4(params) => params.algorithm(),
#[cfg(feature = "sigv4a")]
Self::V4a(params) => params.algorithm(),
}
}
pub fn signature_version(&self) -> SignatureVersion {
match self {
Self::V4(..) => SignatureVersion::V4,
#[cfg(feature = "sigv4a")]
Self::V4a(..) => SignatureVersion::V4a,
}
}
}