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 )