Amazon-SQS-Client

 view release on metacpan or  search on metacpan

lib/Amazon/SQS/Client.pm  view on Meta::CPAN

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
        }
      );
    }
  };

  return $ex
    if ref $ex;

  return Amazon::SQS::Exception->new(
    { Message      => 'Internal Error',
      StatusCode   => $status,
      ResponseBody => $responseBody,
    }
  );
}

#
# perform http post
#
########################################################################
sub _httpPost {
########################################################################
  my ( $self, $queueUrl, $parameters ) = @_;

  my $url = $queueUrl;

  my $ua = $self->get_UserAgent;

  my $request = HTTP::Request->new( POST => $url );
  $request->content_type('application/x-www-form-urlencoded; charset=utf-8');

  my $data = $EMPTY;

  foreach my $parameterName ( keys %{$parameters} ) {
    no warnings 'uninitialized';  ## no critic

    $data .= $parameterName . $EQUALS . $self->_urlencode( $parameters->{$parameterName}, 0 );
    $data .= $AMPERSAND;
  }

  chop $data;

  $request->content($data);

  # sign request here if v4 else, it is done in _addRequiredParameters()
  if ( defined $self->get_v4_signer ) {
    $self->get_v4_signer->sign($request);
  }

  $self->set_last_request($request);

  my $response = $ua->request($request);

  $self->set_last_response($response);

  return $response;
}

#
# Add authentication related and version parameters
#
sub _addRequiredParameters {
  my ( $self, $parameters, $queueUrl ) = @_;

  my $credentials           = $self->get_credentials;
  my $token                 = $credentials->get_token;
  my $aws_access_key_id     = $credentials->get_aws_access_key_id;
  my $aws_secret_access_key = $credentials->get_aws_secret_access_key;

  $parameters->{AWSAccessKeyId} = $aws_access_key_id;
  $parameters->{Timestamp}      = $self->_getFormattedTimestamp();
  $parameters->{Version}        = $self->get_ServiceVersion;

  # v2 signing
  if ( !defined $self->{_v4_signer} ) {
    if ($token) {
      $parameters->{SecurityToken} = $token;
    }

    $parameters->{SignatureVersion} = $self->get_SignatureVersion || '1';
    $parameters->{Signature}        = $self->_signParameters( $parameters, $queueUrl, $aws_secret_access_key );
  }

  return $parameters;
}

#
# Computes RFC 2104-compliant HMAC signature for request parameters
# Implements AWS Signature, as per following spec:



( run in 1.503 second using v1.01-cache-2.11-cpan-39bf76dae61 )