Amazon-S3-Thin
view release on metacpan or search on metacpan
lib/Amazon/S3/Thin.pm view on Meta::CPAN
# https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
my $region = $self->{region};
my $content ;
if ($region eq "us-east-1") {
$content = "";
} else {
my $location_constraint = "<LocationConstraint>$region</LocationConstraint>";
$content = <<"EOT";
<CreateBucketConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">$location_constraint</CreateBucketConfiguration>
EOT
}
my $request = $self->_compose_request('PUT', $self->_resource($bucket), $headers, $content);
return $self->_send($request);
}
sub delete_bucket {
my ($self, $bucket) = @_;
my $request = $self->_compose_request('DELETE', $self->_resource($bucket));
return $self->_send($request);
}
sub generate_presigned_post {
my ($self, $bucket, $key, $fields, $conditions, $expires_in) = @_;
croak 'must specify bucket' unless defined $bucket;
croak 'must specify key' unless defined $key;
if ($self->{signature_version} == 4) {
my $resource = $self->_resource($bucket);
my $protocol = $self->secure ? 'https' : 'http';
return {
($self->virtual_host
? (url => $resource->to_virtual_hosted_style_url($protocol))
: (url => $resource->to_path_style_url($protocol, $self->{region}))),
fields => $self->{signer}->_generate_presigned_post(
$bucket, $key, $fields, $conditions, $expires_in
),
};
} else {
croak 'generate_presigned_post is only supported on signature v4';
}
}
sub _resource {
my ($self, $bucket, $key, $query_string) = @_;
return Amazon::S3::Thin::Resource->new($bucket, $key, $query_string);
}
sub _validate_acl_short {
my ($self, $policy_name) = @_;
if (!grep({$policy_name eq $_}
qw(private public-read public-read-write authenticated-read)))
{
croak "$policy_name is not a supported canned access policy";
}
}
# make the HTTP::Request object
sub _compose_request {
my ($self, $method, $resource, $headers, $content, $metadata) = @_;
croak 'must specify method' unless $method;
croak 'must specify resource' unless defined $resource;
if (ref $resource ne 'Amazon::S3::Thin::Resource') {
croak 'resource must be an instance of Amazon::S3::Thin::Resource';
}
$headers ||= {};
$metadata ||= {};
# generates an HTTP::Headers objects given one hash that represents http
# headers to set and another hash that represents an object's metadata.
my $http_headers = HTTP::Headers->new;
while (my ($k, $v) = each %$headers) {
$http_headers->header($k => $v);
}
while (my ($k, $v) = each %$metadata) {
$http_headers->header("$METADATA_PREFIX$k" => $v);
}
my $protocol = $self->secure ? 'https' : 'http';
my $url;
if ($self->{signature_version} == 4) {
if ($self->virtual_host) {
$url = $resource->to_virtual_hosted_style_url($protocol);
} else {
$url = $resource->to_path_style_url($protocol, $self->{region});
}
} else {
$url = $resource->to_url_without_region($protocol, $MAIN_HOST);
}
my $request = HTTP::Request->new($method, $url, $http_headers, $content);
# sign the request using the signer, unless already signed
if (!$request->header('Authorization')) {
$self->{signer}->sign($request);
}
return $request;
}
1;
__END__
=head1 NAME
Amazon::S3::Thin - A thin, lightweight, low-level Amazon S3 client
=head1 SYNOPSIS
use Amazon::S3::Thin;
# Pass in explicit credentials
my $s3client = Amazon::S3::Thin->new({
aws_access_key_id => $aws_access_key_id,
aws_secret_access_key => $aws_secret_access_key,
aws_session_token => $aws_session_token, # optional
region => $region, # e.g. 'ap-northeast-1'
});
# Get credentials from environment
my $s3client = Amazon::S3::Thin->new({region => $region, credential_provider => 'env'});
# Get credentials from instance metadata
my $s3client = Amazon::S3::Thin->new({
region => $region,
credential_provider => 'metadata',
version => 2, # optional (default 2)
role => 'my-role', # optional
});
# Get credentials from ECS task role
my $s3client = Amazon::S3::Thin->new({
region => $region,
credential_provider => 'ecs_container',
});
my $bucket = "mybucket";
my $key = "dir/file.txt";
my $response;
$response = $s3client->put_bucket($bucket);
$response = $s3client->put_object($bucket, $key, "hello world");
$response = $s3client->get_object($bucket, $key);
print $response->content; # => "hello world"
$response = $s3client->delete_object($bucket, $key);
$response = $s3client->list_objects(
$bucket,
{prefix => "foo", delimiter => "/"}
( run in 0.445 second using v1.01-cache-2.11-cpan-5623c5533a1 )