Amazon-Signature4-Lite
view release on metacpan or search on metacpan
lib/Amazon/Signature4/Lite.pm view on Meta::CPAN
package Amazon::Signature4::Lite;
use strict;
use warnings;
use Digest::SHA qw(sha256_hex hmac_sha256 hmac_sha256_hex);
use MIME::Base64 qw(encode_base64);
use POSIX qw(strftime);
use URI::Escape qw(uri_escape_utf8);
our $VERSION = '1.0.0';
my @SERVICE_URL_PATTERNS = (
qr/(s3)[.]amazonaws[.]com\z/xsm,
qr/(s3)[.]([^.]+)[.]amazonaws[.]com\z/xsm,
qr/(s3)[.][^.]+[.]([^.]+)[.]amazonaws[.]com\z/xsm,
qr/(s3)[-][^.]+[.].+[.]([^.]+)[.]amazonaws[.]com\z/xsm,
qr/^([[:alnum:]-]+)[.]([^.]+)[.]amazonaws[.]com\z/xsm, # service.region.amazonaws.com
qr/^([[:alnum:]-]+)[.]amazonaws[.]com\z/xsm, # service.amazonaws.com (no region)
lib/Amazon/Signature4/Lite.pm view on Meta::CPAN
# sort and build canonical headers string
my @header_keys = sort { lc($a) cmp lc($b) } keys %sign_headers;
my $canon_headers = join q{}, map { lc($_) . ':' . $sign_headers{$_} . "\n" } @header_keys;
my $signed_headers = join ';', map { lc($_) } @header_keys;
# canonical query string - sort by encoded key then encoded value
my $canon_query = q{};
if ($query) {
my @pairs = map {
join '=', map { uri_escape_utf8($_) } split /=/xsm, $_, 2
}
sort { $a cmp $b }
split /&/xsm, $query;
$canon_query = join '&', @pairs;
}
# canonical request
my $canon_request = join "\n", $method, _encode_path($path), $canon_query, $canon_headers, $signed_headers, $payload_hash;
# credential scope
lib/Amazon/Signature4/Lite.pm view on Meta::CPAN
# return merged headers ready for HTTP::Tiny
return { %sign_headers, 'Authorization' => $authorization, };
}
########################################################################
sub _encode_path {
########################################################################
my ($path) = @_;
# encode each segment individually, preserving slashes
return join '/', map { uri_escape_utf8($_) } split m{/}xsm, $path, -1;
}
1;
__END__
=head1 NAME
Amazon::Signature4::Lite - Lightweight AWS Signature Version 4 signing
( run in 0.481 second using v1.01-cache-2.11-cpan-437f7b0c052 )