AWS-SQS-Simple

 view release on metacpan or  search on metacpan

lib/AWS/SQS/Simple.pm  view on Meta::CPAN


$ob->get_queue_attributes->( \%params_hash )


=cut

sub get_queue_attributes {

    my $self   = shift ;
    my $params = shift ;

    my $params_to_pass = {
        'Action'                => 'GetQueueAttributes'       ,
        'AWSAccessKeyId'        => $self->{ ACCESS_KEY }      ,
        'Timestamp'             => _generate_timestamp()      ,
        'SignatureVersion'      => 2                          ,
        'Version'               => '2012-11-05'               ,
        'SignatureMethod'       => 'HmacSHA256'               ,

	%{ $params }
    };


    my $url      = $self->_get_url( $params_to_pass ) ;
    my $response = $self->_make_request( $url )       ;
    
    return $response                                  ;
}


=head1 INTERNAL SUBROUTINES/METHODS

Following methods are used only by the modules.

=head2 _get_url
	
This function creates and returns url as per the parameters passed.

=cut

sub _get_url {
    
    my $self        = shift ;
    my $params      = shift ;

    my $url_additional_str = $self->{ AWS_ACCOUNT_ID } . '/' . delete( $params->{ QUEUE_NAME } ) ;

    my $sign_query = _get_signed_query( $params ) ;
    
    my $to_escape = qr{^(?:Signature|MessageBody|ReceiptHandle)|\.\d+\.(?:MessageBody|ReceiptHandle)$} ;
    foreach my $key( keys %$params ) {

        next unless $key =~ m/$to_escape/    ;
        next unless exists $params->{ $key } ;

        my $octets        = encode( 'utf-8-strict', $params->{ $key } ) ;
        $params->{ $key } = escape( $octets )                           ;

    }

    my $uri_str   = join('&', map { $_ . '=' . $params->{$_} } keys %$params )             ;

    my $sign_str  = "GET\n".$self->{ END_POINT }."\n/"                                     ; 
       $sign_str .= $url_additional_str . "/" if( $params->{ Action } ne "CreateQueue"  )  ;
       $sign_str .= "\n" . $sign_query                                                     ;


    my $signature = $self->_generate_signatue( $sign_str ) ;
    
    $uri_str .= '&Signature=' . escape( $signature )       ;

    my $url   =  "http://".$self->{ END_POINT }                                               ;
       $url  .=  '/' . $url_additional_str . '/' if( $params->{ Action } ne "CreateQueue"  )  ;
       $url  .=  '?' . $uri_str                                                               ;

    return $url ;

}

=head2 _generate_signatue
	
This function generate signature using HMACSHA256 method and version 2.

=cut

sub _generate_signatue {

    my $self   = shift ;
    my $query  = shift ;
    
    my $secret_access_key = $self->{ SECRET_ACCESS_KEY } ;

    my $digest = encode_base64( hmac_sha256($query, $secret_access_key ),'' ) ;

    return $digest ;
}

=head2 _get_signed_query
	
This function utf8 encodes and uri escapes the parameters passed to generate the signed string.

=cut

sub _get_signed_query {

    my $params = shift ;

    my $to_sign ;
    for my $key( sort keys %$params ) {

        $to_sign .= '&' if $to_sign ;

        my $key_octets   = encode('utf-8-strict', $key              ) ;
        my $value_octets = encode('utf-8-strict', $params->{ $key } ) ;

        $to_sign .= escape( $key_octets ) . '=' . escape( $value_octets ) ;

    }
    
    return $to_sign ;
}



( run in 0.570 second using v1.01-cache-2.11-cpan-140bd7fdf52 )