Furl-S3
view release on metacpan or search on metacpan
lib/Furl/S3.pm view on Meta::CPAN
}
return 1;
}
sub string_to_sign {
my( $self, $method, $resource, $headers ) = @_;
$headers ||= {};
my %headers_to_sign;
while (my($k, $v) = each %{$headers}) {
my $key = lc $k;
if ( $key =~ /^(content-md5|content-type|date|expires)$/ or
$key =~ /^x-amz-/ ) {
$headers_to_sign{$key} = _trim($v);
}
}
my $str = "$method\n";
$str .= $headers_to_sign{'content-md5'} || '';
$str .= "\n";
$str .= $headers_to_sign{'content-type'} || '';
$str .= "\n";
$str .= $headers_to_sign{'expires'} || $headers_to_sign{'date'} || '';
$str .= "\n";
for my $key( sort grep { /^x-amz-/ } keys %headers_to_sign ) {
$str .= "$key:$headers_to_sign{$key}\n";
}
my( $path, $query ) = split /\?/, $resource;
# sub-resource.
if ( $query && $query =~ m{^(acl|policy|location|versions)$} ) {
$str .= $resource;
lib/Furl/S3.pm view on Meta::CPAN
{ type => HASHREF | UNDEF , optional => 1, },
{ type => HASHREF | UNDEF , optional => 1, }, );
$self->clear_error;
$key ||= '';
$params ||= +{};
$headers ||= +{};
$furl_options ||= +{};
my %h;
while (my($key, $val) = each %{$headers}) {
$key =~ s/_/-/g; # content_type => content-type
$h{lc($key)} = $val
}
if ( !$h{'expires'} && !$h{'date'} ) {
$h{'date'} = time2str(time);
}
my $resource = $self->resource( $bucket, $key );
my $string_to_sign =
$self->string_to_sign( $method, $resource, \%h );
my $signed_string = $self->sign( $string_to_sign );
my $auth_header = 'AWS '. $self->aws_access_key_id. ':'. $signed_string;
lib/Furl/S3.pm view on Meta::CPAN
sub create_object_from_file {
my $self = shift;
my( $bucket, $key, $filename, $headers ) = @_;
validate_pos( @_, 1, 1, 1,
{ type => HASHREF, optional => 1 } );
$headers ||= {};
my $has_ct = 0;
for my $key( keys %{$headers} ) {
if (lc($key) =~ qr/^(content_type|content-type)$/) {
$has_ct = 1;
last ;
}
}
unless ( $has_ct ) {
require File::Type;
my $ft = File::Type->new;
my $content_type = $ft->checktype_filename( $filename );
$headers->{'content_type'} = $content_type;
}
lib/Furl/S3.pm view on Meta::CPAN
my %res;
while (my($k, $v) = each %{$res->{headers}}) {
$res{$k} = $v;
}
# remove etag's double quote.
if ( my $etag = $res{'etag'} ) {
$res{etag} = _remove_quote( $etag );
}
# make aliases
$res{content_length} = $res{'content-length'};
$res{content_type} = $res{'content-type'};
$res{last_modified} = $res{'last-modified'};
unless ( $is_head ) {
$res{content} = $res->{body};
}
return \%res;
}
sub get_object {
my $self = shift;
t/01_signature.t view on Meta::CPAN
is $string_to_sign, $expected, 'GET';
}
{
my $date = time2str( time );
my $resource = '/foo/bar-baz.txt';
# encode_base64(md5('hoge'));
my $md5 = '6nA+eqHv2gBk6qUH2eirfg==';
my $content_type = 'text/plain';
my $string_to_sign = $s3->string_to_sign('PUT', $resource, {
'content-type' => $content_type,
'content-md5' => $md5,
'x-amz-acl' => 'public-read',
date => $date,
});
my $expected =
"PUT\n".
"$md5\n".
"$content_type\n".
"$date\n".
( run in 1.302 second using v1.01-cache-2.11-cpan-524268b4103 )