File Coverage

blib/lib/Plack/Middleware/SizeLimit.pm
Criterion Covered Total %
statement 31 35 88.5
branch 4 14 28.5
condition 3 8 37.5
subroutine 7 7 100.0
pod 2 2 100.0
total 47 66 71.2


line stmt bran cond sub pod time code
1             package Plack::Middleware::SizeLimit;
2 1     1   627 use 5.008;
  1         6  
3 1     1   5 use strict;
  1         2  
  1         19  
4 1     1   5 use warnings;
  1         2  
  1         28  
5 1         5 use parent qw(
6             Plack::Middleware
7             Process::SizeLimit::Core
8 1     1   5 );
  1         2  
9 1         9 use Plack::Util::Accessor qw(
10             max_unshared_size_in_kb
11             min_shared_size_in_kb
12             max_process_size_in_kb
13             check_every_n_requests
14             log_when_limits_exceeded
15 1     1   26621 );
  1         2  
16              
17             our $VERSION = '0.10';
18              
19             sub prepare_app {
20 1     1 1 98 my $self = shift;
21 1   50     4 $self->set_check_interval($self->check_every_n_requests || 1);
22 1         66 $self->set_max_process_size($self->max_process_size_in_kb);
23 1         12 $self->set_min_shared_size($self->min_shared_size_in_kb);
24 1         12 $self->set_max_unshared_size($self->max_unshared_size_in_kb);
25             }
26              
27             sub call {
28 1     1 1 21591 my ($self, $env) = @_;
29              
30 1         7 my $res = $self->app->($env);
31              
32 1 0 33     41 return $res unless $env->{'psgix.harakiri'} or $env->{'psgix.harakiri.supported'};
33              
34 1 50       4 if (my $interval = $self->check_every_n_requests) {
35 0         0 my $pinc = $self->get_and_pinc_request_count;
36 0 0       0 return $res if ($pinc % $interval);
37             }
38              
39 1         7 my $harakiri;
40 1 50       5 if ($env->{'psgix.harakiri'}) {
    0          
41             # Canonical implementation (Starman 0.2012+)
42 1         9 $harakiri = $env->{'psgix.harakiri.commit'} = $self->_limits_are_exceeded;
43             }
44             elsif ($env->{'psgix.harakiri.supported'}) {
45             # Legacy implementation (uWSGI)
46 0         0 $harakiri = $env->{'psgix.harakiri'} = $self->_limits_are_exceeded;
47             }
48              
49 1 50 33     18459 if ($harakiri && $self->log_when_limits_exceeded) {
50             my $message = sprintf(
51             'pid %d committed harakiri (size: %d, shared: %d, unshared: %d) at %s',
52             $$, $self->_check_size, $env->{REQUEST_URI},
53 1         11 );
54 1 50       16679 if (my $logger = $env->{'psgix.logger'}) {
55 1         8 $logger->( { message => $message, level => 'warn' } );
56             }
57             else {
58 0         0 warn "$message\n";
59             }
60             }
61              
62 1         13 return $res;
63             }
64              
65             1;
66             __END__