Amazon-SQS-Client
view release on metacpan or search on metacpan
lib/Amazon/SQS/Client.pm view on Meta::CPAN
$parameters = $self->_addRequiredParameters( $parameters, $queueUrl );
my $retries = 0;
my $shouldRetry = $TRUE;
my $response;
eval {
do {
# Submit the request and read response body #
eval {
$response = $self->_httpPost( $queueUrl, $parameters );
if ( $response->is_success ) {
$shouldRetry = $FALSE;
}
else {
if ( $response->code == $HTTP_INTERNAL_SERVER_ERROR || $response->code == $HTTP_GATEWAY_TIMEOUT ) {
$shouldRetry = $TRUE;
$self->_pauseOnRetry( ++$retries, $response->code, $response->content );
}
else {
my $ex = $self->_reportAnyErrors( $response->content, $response->code );
if ($ex) {
Carp::croak($ex);
}
}
}
};
my $e = $EVAL_ERROR;
if ($e) {
if ( ref $e eq 'Amazon::SQS::Exception' ) {
Carp::croak $e;
}
else {
Carp::croak( Amazon::SQS::Exception->new( { Message => $e } ) );
}
}
} while ($shouldRetry); ## no critic
};
my $e = $EVAL_ERROR;
if ($e) {
if ( ref $e eq 'Amazon::SQS::Exception' ) {
Carp::croak $e;
}
else {
Carp::croak( Amazon::SQS::Exception->new( { Message => $e } ) );
}
}
return $response->content;
}
#
# Exponential sleep on failed request
# Retries - current retry
# throws Amazon::SQS::Exception if maximum number of retries has been reached
#
########################################################################
sub _pauseOnRetry {
########################################################################
my ( $self, $retries, $status, $error ) = @_;
if ( $retries <= $self->get_MaxErrorRetry ) {
my $delay = ( 4**$retries ) * 100_000;
usleep($delay);
}
else {
die Amazon::SQS::Exception->new(
{ Message => 'Maximum number of retry attempts reached : ' . ( $retries - 1 ),
StatusCode => $status,
HTTPError => $error,
ErrorCode => $status,
}
);
}
return;
}
#
# Look for additional error strings in the response and return formatted exception
#
########################################################################
sub _reportAnyErrors {
########################################################################
my ( $self, $responseBody, $status, $e ) = @_;
my $ex = eval {
my $error = XML::Simple::XMLin($responseBody);
return $responseBody
if !ref $error || !$error->{Error};
#<ErrorResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
# <Error>
# <Code>AWS.SimpleQueueService.NonExistentQueue</Code>
# <Message>The specified queue does not exist for this wsdl version.</Message>
# <Type>Sender</Type>
# </Error>
# <RequestId>1bae4a91-7804-45a5-94b0-c884ddc2f140</RequestId>
#</ErrorResponse>
if ( $error->{Error} ) {
my $requestId = $error->{RequestId};
my $code = $error->{Error}->{Code};
my $message = $error->{Error}->{Message};
return Amazon::SQS::Exception->new(
{ Message => $message,
StatusCode => $status,
ErrorCode => $code,
ErrorType => $error->{Error}->{Type} // 'Unknown',
RequestId => $requestId,
XML => $responseBody
( run in 1.627 second using v1.01-cache-2.11-cpan-39bf76dae61 )