Amazon-S3-Thin

 view release on metacpan or  search on metacpan

lib/Amazon/S3/Thin/Resource.pm  view on Meta::CPAN

package Amazon::S3::Thin::Resource;
use strict;
use warnings;
use URI::Escape qw(uri_escape_utf8);

sub new {
    my $class = shift;
    my $bucket = shift;
    my $key = shift;
    my $query_string = shift;

    my $self = {
        bucket => $bucket,
        key => $key,
        query_string => $query_string,
    };
    bless $self, $class;
}

sub _composer_url {
    my $self = shift;
    my $protocol = shift;
    my $host = shift;
    my $path = shift;

    return "$protocol://$host/$path",
}

sub to_path_style_url {
    my $self = shift;
    my $protocol = shift;
    my $region = shift;
    return $self->_composer_url(
        $protocol,
        $self->_region_specific_host($region),
        $self->{bucket} . '/' . $self->key_and_query
    );
}

sub to_virtual_hosted_style_url {
    my $self = shift;
    my $protocol = shift;
    return $self->_composer_url(
        $protocol,
        sprintf("%s.s3.amazonaws.com", $self->{bucket}),
        $self->key_and_query
    );
}

sub _region_specific_host {
    my $self = shift;
    my $region = shift;

    if ($region eq 'us-east-1') {
        return 's3.amazonaws.com';
    }

    return sprintf('s3.%s.amazonaws.com', $region); # 's3.eu-west-1.amazonaws.com'
}


# to keep B.C. for old implementation in case region is not given
sub to_url_without_region {
    my $self = shift;
    my $protocol = shift;
    my $main_host = shift;

    my $url;

    my $bucket = $self->{bucket};
    if ($self->_is_dns_bucket($self->{bucket})) {
        # vhost style
        $url = $self->_composer_url($protocol, $bucket . '.' . $main_host, $self->key_and_query);
    } else {
        # path style
        $url = $self->_composer_url($protocol, $main_host, $self->{bucket} . "/" . $self->key_and_query);
    }



( run in 1.162 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )