Plack-Middleware-Security-Simple
view release on metacpan or search on metacpan
lib/Plack/Middleware/Security/Simple.pm view on Meta::CPAN
package Plack::Middleware::Security::Simple;
# ABSTRACT: A simple security filter for Plack
use v5.14;
use warnings;
use parent qw( Plack::Middleware );
use Hash::Match;
use HTTP::Status qw( HTTP_BAD_REQUEST );
use Ref::Util qw/ is_plain_arrayref is_plain_hashref /;
use Plack::Response;
use Plack::Util::Accessor qw( rules handler status );
# RECOMMEND PREREQ: Ref::Util::XS
our $VERSION = 'v0.13.0';
sub prepare_app {
my ($self) = @_;
if (my $rules = $self->rules) {
if ( is_plain_arrayref($rules) || is_plain_hashref($rules) ) {
$self->rules( Hash::Match->new( rules => $rules ) );
}
}
unless ( $self->status ) {
$self->status( HTTP_BAD_REQUEST );
}
unless ( $self->handler ) {
$self->handler(
sub {
my ($env) = @_;
my $status = $self->status;
if ( my $logger = $env->{'psgix.logger'} ) {
$logger->({
level => "warn",
message => __PACKAGE__
. " Blocked $env->{REMOTE_ADDR} $env->{REQUEST_METHOD} $env->{REQUEST_URI} HTTP $status"
});
}
my $res = Plack::Response->new($status, [ 'Content-Type' => 'text/plain' ], [ "Bad Request" ] );
return $res->finalize;
}
);
}
}
sub call {
my ( $self, $env ) = @_;
if (my $rules = $self->rules) {
return $self->handler()->( $env ) if $rules->($env);
}
return $self->app->($env);
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
Plack::Middleware::Security::Simple - A simple security filter for Plack
( run in 2.777 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )