File Coverage

blib/lib/AWS/Signature/V2.pm
Criterion Covered Total %
statement 35 39 89.7
branch 1 2 50.0
condition 2 5 40.0
subroutine 6 8 75.0
pod 0 2 0.0
total 44 56 78.5


line stmt bran cond sub pod time code
1             package AWS::Signature::V2;
2 2     2   57026 use Moo;
  2         37006  
  2         12  
3 2     2   4946 use Digest::SHA qw(hmac_sha256_base64);
  2         7504  
  2         171  
4 2     2   1381 use URI::Escape;
  2         3683  
  2         116  
5 2     2   1725 use Encode qw/decode_utf8/;
  2         20020  
  2         1122  
6              
7             our $VERSION = "0.01";
8              
9             has aws_access_key => (is => 'rw', required => 1, builder => 1);
10             has aws_secret_key => (is => 'rw', required => 1, builder => 1);
11              
12 0     0   0 sub _build_aws_access_key { $ENV{AWS_ACCESS_KEY} }
13 0     0   0 sub _build_aws_secret_key { $ENV{AWS_SECRET_KEY} }
14              
15             sub sign {
16 1     1 0 56499 my ($self, $url) = @_;
17 1         9 my %eq = map { split /=/, $_ } split /&/, $url->query();
  7         46  
18 1         8 my %q = map { $_ => decode_utf8( uri_unescape( $eq{$_} ) ) } keys %eq;
  7         268  
19 1 50       35 $q{Keywords} =~ s/\+/ /g if $q{Keywords};
20 1         15 $q{AWSAccessKeyId} = $self->aws_access_key;
21 1   33     8 $q{Timestamp} ||= do {
22 0         0 my ( $ss, $mm, $hh, $dd, $mo, $yy ) = gmtime();
23 0         0 join '',
24             sprintf( '%04d-%02d-%02d', $yy + 1900, $mo + 1, $dd ), 'T',
25             sprintf( '%02d:%02d:%02d', $hh, $mm, $ss ), 'Z';
26             };
27 1   50     8 $q{Version} ||= '2010-09-01';
28             my $sq = join '&',
29 1         12 map { $_ . '=' . uri_escape_utf8( $q{$_}, "^A-Za-z0-9\-_.~" ) }
  7         458  
30             sort keys %q;
31 1         50 my $tosign = join "\n", 'GET', $url->host, $url->path, $sq;
32 1         154 my $signature = hmac_sha256_base64( $tosign, $self->aws_secret_key );
33 1         9 $signature .= '=' while length($signature) % 4; # padding required
34 1         5 $q{Signature} = $signature;
35 1         6 $url->query_form( \%q );
36 1         333 $url;
37             }
38              
39             sub signature {
40 1     1 0 7 my ($self, $url) = @_;
41 1         5 my %eq = map { split /=/, $_ } split /&/, $url->query();
  8         44  
42 1         9 my %q = map { $_ => uri_unescape( $eq{$_} ) } keys %eq;
  8         89  
43 1         33 $q{Signature};
44             }
45              
46              
47             1;
48             __END__