Stancer
view release on metacpan or search on metacpan
lib/Stancer/Exceptions/Http.pm view on Meta::CPAN
package Stancer::Exceptions::Http;
use 5.020;
use strict;
use warnings;
# ABSTRACT: Abstract exception for every HTTP errors
our $VERSION = '1.0.3'; # VERSION
use Stancer::Core::Types qw(InstanceOf);
use HTTP::Status qw(status_message);
use Moo;
extends 'Stancer::Exceptions::Throwable';
use namespace::clean;
has '+log_level' => (
default => 'warning',
);
has '+message' => (
default => sub {
my $this = shift;
my $code = $this->status;
return status_message($code) if defined $code;
return $this->_default_message;
},
lazy => 1,
);
has '_default_message' => (
is => 'ro',
default => 'HTTP error',
);
has request => (
is => 'ro',
isa => InstanceOf['HTTP::Request'],
);
has response => (
is => 'ro',
isa => InstanceOf['HTTP::Response'],
);
has status => (
is => 'ro',
builder => sub {
my $this = shift;
my @parts = split m/::/sm, ref $this;
my $class = $parts[-1];
$class =~ s/([[:upper:]])/_$1/xgsm;
my $constant = 'HTTP' . uc $class;
return HTTP::Status->$constant if HTTP::Status->can($constant);
},
);
sub factory {
my ($class, $status, @args) = @_;
my $data;
if (scalar @args == 1) {
$data = $args[0];
} else {
$data = {@args};
}
$data->{status} = $status;
my $instance = Stancer::Exceptions::Http->new($data);
require Stancer::Exceptions::Http::BadRequest;
require Stancer::Exceptions::Http::ClientSide;
require Stancer::Exceptions::Http::Conflict;
require Stancer::Exceptions::Http::InternalServerError;
require Stancer::Exceptions::Http::NotFound;
require Stancer::Exceptions::Http::ServerSide;
require Stancer::Exceptions::Http::Unauthorized;
$instance = Stancer::Exceptions::Http::ClientSide->new($data) if $status >= 400;
$instance = Stancer::Exceptions::Http::ServerSide->new($data) if $status >= 500;
$instance = Stancer::Exceptions::Http::BadRequest->new($data) if $status == 400;
$instance = Stancer::Exceptions::Http::Unauthorized->new($data) if $status == 401;
$instance = Stancer::Exceptions::Http::NotFound->new($data) if $status == 404;
$instance = Stancer::Exceptions::Http::Conflict->new($data) if $status == 409;
$instance = Stancer::Exceptions::Http::InternalServerError->new($data) if $status == 500;
return $instance;
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Stancer::Exceptions::Http - Abstract exception for every HTTP errors
=head1 VERSION
version 1.0.3
( run in 0.424 second using v1.01-cache-2.11-cpan-5511b514fd6 )