Amazon-SNS
view release on metacpan or search on metacpan
lib/Amazon/SNS.pm view on Meta::CPAN
my $r = $self->dispatch({
'Action' => 'CreateTopic',
'Name' => $name,
});
my $arn = eval { $r->{'CreateTopicResult'}{'TopicArn'} };
return defined $arn ? $self->GetTopic($arn) : undef;
}
sub GetTopic
{
my ($self, $arn) = @_;
return Amazon::SNS::Topic->new({
'sns' => $self,
'arn' => $arn,
});
}
sub GetTarget
{
my ($self, $arn) = @_;
return Amazon::SNS::Target->new({
'sns' => $self,
'arn' => $arn,
});
}
sub DeleteTopic
{
my ($self, $arn) = @_;
return $self->dispatch({
'Action' => 'DeleteTopic',
'TopicArn' => $arn,
});
}
sub ListTopics
{
my ($self, $name) = @_;
my $r = $self->dispatch({
'Action' => 'ListTopics',
});
return map {
Amazon::SNS::Topic->new({
'sns' => $self,
'arn' => $_->{'TopicArn'},
})
} @{$r->{'ListTopicsResult'}{'Topics'}[0]{'member'}};
}
sub Subscribe
{
my ($self, $protocol, $topicarn, $endpoint) = @_;
$self->dispatch({
'Action' => 'Subscribe',
'Protocol' => $protocol,
'TopicArn' => $topicarn,
'Endpoint' => $endpoint,
});
}
sub Unsubscribe
{
my ($self, $arn) = @_;
$self->dispatch({
'Action' => 'Unsubscribe',
'SubscriptionArn' => $arn,
});
}
sub dispatch
{
my ($self, $args) = @_;
$self->error(undef);
$self->service('http://sns.eu-west-1.amazonaws.com')
unless defined $self->service;
# sanitize args
do { delete $args->{$_} unless defined $args->{$_} } for (keys %$args);
# add signature elements
$args->{'Timestamp'} = $self->timestamp;
$args->{'AWSAccessKeyId'} = $self->key;
$args->{'SignatureVersion'} = 2;
$args->{'SignatureMethod'} = 'HmacSHA256';
$args->{'Version'} = '2010-03-31';
if (defined($args->{'Attributes'}) and ref($args->{'Attributes'}) eq 'HASH') {
foreach my $attr (keys %{$args->{'Attributes'}}) {
$args->{$attr} = $args->{'Attributes'}->{$attr};
}
delete $args->{'Attributes'};
}
# build URI
my $uri = URI->new($self->service);
$uri->path('/');
$uri->query(join('&', map { $_ . '=' . URI::Escape::uri_escape_utf8($args->{$_}, '^A-Za-z0-9\-_.~') } sort keys %$args ));
# create signature
$args->{'Signature'} = hmac_sha256_base64(join("\n", 'POST', $uri->host, $uri->path, $uri->query), $self->secret);
# padding
while (length($args->{'Signature'}) % 4) {
$args->{'Signature'} .= '=';
}
# rewrite query string
$uri->query(join('&', map { $_ . '=' . URI::Escape::uri_escape_utf8($args->{$_}, '^A-Za-z0-9\-_.~') } sort keys %$args ));
my $response = LWP::UserAgent->new->post($self->service, 'Content' => $uri->query);
$self->status_code($response->code);
( run in 0.503 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )