AnyEvent-SparkBot
view release on metacpan or search on metacpan
lib/AnyEvent/HTTP/Spark.pm view on Meta::CPAN
package AnyEvent::HTTP::Spark;
use Modern::Perl;
use Moo;
use MooX::Types::MooseLike::Base qw(:all);
use Data::Dumper;
use JSON qw(to_json from_json);
use HTTP::Request::Common qw(POST);
use Ref::Util qw(is_plain_arrayref is_plain_hashref);
use URI::Escape qw(uri_escape_utf8);
use namespace::clean;
use Scalar::Util qw(looks_like_number);
use AnyEvent;
BEGIN {
no namespace::clean;
with 'HTTP::MultiGet::Role','Log::LogMethods','AnyEvent::SparkBot::SharedRole';
}
has api_url=>(
isa=>Str,
is=>'ro',
lazy=>1,
#default=>'https://api.ciscospark.com/v1/',
default=>'https://webexapis.com/v1/',
);
has retryCount=>(
isa=>Int,
is=>'ro',
default=>1,
);
has retryTimeout=>(
isa=>Int,
is=>'ro',
default=>1,
);
has retryAfter=>(
isa=>Int,
is=>'ro',
default=>10,
);
has retries=>(
isa=>HashRef,
is=>'ro',
default=>sub { return {} },
);
=head1 NAME
AnyEvent::HTTP::Spark - Syncrnous/Asyncrnous HTTP Rest Client for Cisco Spark
=head1 SYNOPSIS
use AnyEvent::HTTP::Spark;
my $obj=new AnyEvent::HTTP::Spark(token=>$ENV{SPARK_TOKEN});
=head1 DESCRIPTION
Dual Nature Syncrnous/Asyncrnous AnyEvent friendly Spark v1 HTTP Client library.
=head1 Moo Roles Used
This class uses the following Moo Roles
HTTP::MultiGet::Role
Log::LogMethods
lib/AnyEvent/HTTP/Spark.pm view on Meta::CPAN
=cut
sub build_post_form {
my ($self,$url,$data)=@_;
my $uri=$self->api_url.$url;
my $form_ref;
if(is_plain_arrayref($data)) {
$form_ref=$data;
} elsif(is_plain_hashref($data)) {
$form_ref=[%{$data}];
} else {
$self->new_failse('Failed to create form post, error was: $data is not a hash or array ref');
}
my $headers=$self->default_headers;
$headers->header('Content-Type', 'multipart/form-data');
my $post=POST $uri,$data;
my @list=$headers->flatten;
while(my ($key,$value)=splice @list,0,2) {
$post->header($key,$value);
}
return $self->new_true($post);
}
=item * my $id=$self->que_post_form($cb,$url,$data);
Queue's a form post and returns the id
=cut
sub que_post_form {
my ($self,$cb,$url,$data)=@_;
return $self->queue_builder($cb,'build_post_form',$url,$data);
}
=item * my $result=$self->build_get($url,$data);
Returns a Data::Result Object, when true it contains the correctly fromatted HTTP::Request Object, when false it contains why it failed.
=cut
sub build_get {
my ($self,$url,$data)=@_;
my $uri=$self->api_url.$url.'?';
my @list;
if(is_plain_arrayref($data)) {
@list=@{$data};
} elsif(is_plain_hashref($data)) {
@list=%{$data};
}
my $headers=$self->default_headers;
my @args;
while(my ($key,$value)=splice @list,0,2) {
push @args,uri_escape_utf8($key).'='.uri_escape_utf8($value);
}
my $args=join '&',@args;
$uri .=$args;
$uri=~ s/\?$//s;
my $get=new HTTP::Request(GET=>$uri,$self->default_headers);
return $self->new_true($get);
}
=item * my $self->que_getRaw($cb,$raw_url)
Que's a diy get request
=cut
sub que_getRaw {
my ($self,$cb,$url)=@_;
my $req=HTTP::Request->new(GET=>$url,$self->default_headers);
return $self->queue_request($req,$cb);
}
=item * my $id=$self->que_get($cb,$url,$data);
Queue's a form post and returns the id
=cut
sub que_get {
my ($self,$cb,$url,$data)=@_;
return $self->queue_builder($cb,'build_get',$url,$data);
}
=item * my $result=$self->build_head($url,$data);
Returns a Data::Result Object, when true it contains the correctly fromatted HTTP::Request Object, when false it contains why it failed.
=cut
sub build_head {
my ($self,$url,$data)=@_;
my $uri=$self->api_url.$url.'?';
my @list;
if(is_plain_arrayref($data)) {
@list=@{$data};
} elsif(is_plain_hashref($data)) {
@list=%{$data};
}
my $headers=$self->default_headers;
my @args;
while(my ($key,$value)=splice @list,0,2) {
push @args,uri_escape_utf8($key).'='.uri_escape_utf8($value);
}
my $args=join '&',@args;
$uri .=$args;
my $get=new HTTP::Request(HEAD=>$uri,$self->default_headers);
return $self->new_true($get);
}
=item * my $id=$self->que_head($cb,$url,$data);
Queue's a form post and returns the id
=cut
sub que_head{
my ($self,$cb,$url,$data)=@_;
return $self->queue_builder($cb,'build_head',$url,$data);
}
=item * my $result=$self->build_delete($url,$data);
Returns a Data::Result Object, when true it contains the delete request, when false it contains why it failed.
=cut
sub build_delete {
my ($self,$url,$data)=@_;
my $uri=$self->api_url.$url.'?';
my @list;
if(is_plain_arrayref($data)) {
@list=@{$data};
} elsif(is_plain_hashref($data)) {
@list=%{$data};
}
my $headers=$self->default_headers;
my @args;
while(my ($key,$value)=splice @list,0,2) {
push @args,uri_escape_utf8($key).'='.uri_escape_utf8($value);
}
my $args=join '&',@args;
$uri .=$args;
my $get=new HTTP::Request(DELETE=>$uri,$self->default_headers);
return $self->new_true($get);
}
=item * my $id=$self->que_delete($cb,$url,$data);
Ques a delete to run.
=cut
sub que_delete {
my ($self,$cb,$url,$data)=@_;
my $code=sub {
my ($self,$id,$result,$request,$response)=@_;
$self->handle_delete($cb,$id,$result,$request,$response);
};
return $self->queue_builder($code,'build_delete',$url,$data);
}
=item * $self->handle_delete($cb,$id,$result,$result)
Internal handler for delete results
=cut
sub handle_delete {
my ($self,$cb,$id,undef,$request,$response)=@_;
if($response->code==204) {
my $result=$self->new_true({message=>'Deleted'});
$cb->($self,$id,$result,$request,$response);
} else {
my $result=$self->new_false("Delete Failed, error was: ".$response->status_line);
$cb->($self,$id,$result,$request,$response);
}
}
=back
=head1 AUTHOR
Michael Shipper <AKALINUX@CPAN.ORG>
=cut
1;
( run in 2.635 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )