App-PAIA
view release on metacpan or search on metacpan
lib/App/PAIA/Agent.pm view on Meta::CPAN
package App::PAIA::Agent;
use strict;
use v5.10;
our $VERSION = '0.30';
use HTTP::Tiny 0.024;
use URI;
use App::PAIA::JSON;
sub new {
my ($class, %options) = @_;
bless {
insecure => !!$options{insecure},
logger => $options{logger},
dumper => $options{dumper},
agent => HTTP::Tiny->new( verify_SSL => (!$options{insecure}) ),
}, $class;
}
sub request {
my $self = shift;
my $method = shift;
my $url = URI->new(shift) // '';
my $param = shift // {};
my $headers = {
Accept => 'application/json',
'User-Agent' => "App::PAIA/".($APP::PAIA::VERSION//'?'),
@_
};
my $content;
$self->{logger}->("$method $url");
my $scheme = $url->scheme // '';
if ($self->{insecure}) {
return $self->error( msg => "Not an URL: $url" )
unless $scheme =~ /^https?$/;
} elsif( $scheme ne 'https' ) {
return $self->error(
msg => "PAIA requires HTTPS unless insecure (got $url)"
);
}
if ($method eq 'POST') {
$headers->{'Content-Type'} = 'application/json';
$content = encode_json($param);
} elsif (%$param) {
$url->query_form(%$param);
}
$self->dump_request( $method, $url, $headers, $content );
my $response = $self->{agent}->request( $method, $url, {
headers => $headers,
content => $content
} );
$self->dump_response( $response );
return $response if $response->{status} eq '599';
my $json = eval { decode_json($response->{content}) };
return $self->error( url => "$url", msg => "$@" ) if "$@";
return ($response, $json);
}
sub error {
my ($self, %opts) = @_;
return {
url => $opts{url} // '',
success => q{},
status => $opts{status} // '599',
reason => 'Internal Exception',
content => $opts{msg},
headers => {
'content-type' => 'text/plain',
( run in 1.167 second using v1.01-cache-2.11-cpan-13bb782fe5a )