Amazon-S3-Lite
view release on metacpan or search on metacpan
lib/Amazon/S3/Lite.pm view on Meta::CPAN
########################################################################
my ( $self, $bucket, $key ) = @_;
croak 'bucket is required' if !defined $bucket || !length $bucket;
croak 'key is required' if !defined $key || !length $key;
my $url = $self->_endpoint( $bucket, $key );
my $response = $self->_request( 'HEAD', $url );
return undef ## no critic (Subroutines::ProhibitExplicitReturnUndef)
if _is_not_found($response);
$self->_croak_on_error( $response, 'head_object' );
return $self->_extract_object_metadata( $response->{headers} );
}
########################################################################
# Extract the standard object metadata hashref from a response headers
# hash. Used by both head_object and get_object.
########################################################################
lib/Amazon/S3/Lite.pm view on Meta::CPAN
print {$fh} $data
or croak "write to '$filename' failed: $!";
};
my $response = $self->_request( 'GET', $url, \%headers, q{}, $extra );
close $fh
or croak "close of '$filename' failed: $!";
return undef ## no critic (Subroutines::ProhibitExplicitReturnUndef)
if _is_not_found($response);
$self->_croak_on_error( $response, 'get_object' );
# Return metadata only â content is on disk
return $self->_extract_object_metadata( $response->{headers} );
}
# In-memory path
my $response = $self->_request( 'GET', $url, \%headers );
return undef ## no critic (Subroutines::ProhibitExplicitReturnUndef)
if _is_not_found($response);
$self->_croak_on_error( $response, 'get_object' );
my $result = $self->_extract_object_metadata( $response->{headers} );
$result->{content} = $response->{content};
return $result;
}
########################################################################
lib/Amazon/S3/Lite.pm view on Meta::CPAN
# Build query string
my $query = join q{&}, map { uri_escape_utf8($_) . q{=} . uri_escape_utf8( $params{$_} ) }
sort keys %params;
my $url = $self->_endpoint($bucket) . q{?} . $query;
my $response = $self->_request( 'GET', $url );
return undef ## no critic (Subroutines::ProhibitExplicitReturnUndef)
if _is_not_found($response);
$self->_croak_on_error( $response, 'list_objects_v2' );
return $self->_parse_list_objects_v2( $response->{content} );
}
########################################################################
# Parse the XML body of a ListObjectsV2 response
########################################################################
########################################################################
lib/Amazon/S3/Lite.pm view on Meta::CPAN
########################################################################
# Error checking helpers
########################################################################
sub _is_success {
########################################################################
return $_[0]->{status} =~ /\A2\d{2}\z/;
}
########################################################################
sub _is_not_found {
########################################################################
return $_[0]->{status} == 404;
}
########################################################################
sub _croak_on_error {
########################################################################
my ( $self, $response, $context ) = @_;
return if _is_success($response);
t/01-s3-lite.t view on Meta::CPAN
is $obj->{key}, 'logs/2024-01-01.gz', 'key';
is $obj->{size}, 1024, 'size is integer';
is $obj->{etag}, 'abc123', 'etag stripped of quotes';
# missing bucket croaks
eval { $s3->list_objects_v2() };
like $@, qr/bucket is required/, 'croaks without bucket';
# 404 returns undef
local *Amazon::S3::Lite::_request = mock_request( status => 404 );
my $not_found = $s3->list_objects_v2('no-such-bucket');
ok !defined $not_found, '404 returns undef';
};
subtest 'list_all_objects_v2 pagination' => sub {
my $s3 = new_s3();
my $page = 0;
no warnings 'redefine';
local *Amazon::S3::Lite::list_objects_v2 = sub {
my ( $self, $bucket, %opts ) = @_;
$page++;
( run in 2.827 seconds using v1.01-cache-2.11-cpan-9581c071862 )