The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

package AWS::S3::Request::GetPreSignedUrl;
use Moose;

use AWS::S3::Signer;
use URI::Escape qw(uri_escape);

with 'AWS::S3::Roles::Request';

has 'bucket' => ( is => 'ro', isa => 'Str', required => 1 );
has 'key' => ( is => 'ro', isa => 'Str', required => 1 );
has 'expires' => ( is => 'ro', isa => 'Int', required => 1 );

sub request {
    my $s = shift;

    my $uri = $s->_uri;

    my $req = "GET\n\n\n"
        . $s->expires . "\n/"
        . $s->bucket . "/"
        . $s->key;

    my $signer = AWS::S3::Signer->new(
        s3             => $s->s3,
        method         => "GET",
        uri            => $uri,
        string_to_sign => $req,
    );

    my $signed_uri = $uri->as_string
        . '?AWSAccessKeyId=' . $s->s3->access_key_id
        . '&Expires=' . $s->expires
        . '&Signature=' . uri_escape( $signer->signature );

    return $signed_uri;
}

__PACKAGE__->meta->make_immutable;