File Coverage

blib/lib/Plack/Middleware/NeverExpire.pm
Criterion Covered Total %
statement 23 23 100.0
branch 2 4 50.0
condition n/a
subroutine 8 8 100.0
pod 3 3 100.0
total 36 38 94.7


line stmt bran cond sub pod time code
1 1     1   387643 use 5.008001; use strict; use warnings;
  1     1   4  
  1     1   4  
  1         1  
  1         32  
  1         3  
  1         2  
  1         91  
2              
3             package Plack::Middleware::NeverExpire;
4              
5             our $VERSION = '1.201';
6              
7 1     1   4 BEGIN { require Plack::Middleware; our @ISA = 'Plack::Middleware' }
  1         31  
8              
9 1     1   4 use Plack::Util ();
  1         1  
  1         275  
10              
11             sub ONE_YEAR () { 31_556_930 } # 365.24225 days
12              
13             # RFC 9110 Section 5.6.7
14             my @DAY = qw( Sun Mon Tue Wed Thu Fri Sat );
15             my @MON = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
16             sub FMT () { '%s, %02d %s %04d %02d:%02d:%02d GMT' }
17             sub imf_fixdate {
18 1     1 1 4 my @f = gmtime $_[0];
19 1         10 sprintf FMT, $DAY[$f[6]], $f[3], $MON[$f[4]], 1900+$f[5], @f[2,1,0];
20             }
21              
22             my $cached_stamp = imf_fixdate my $cached_time = time;
23             sub inject_headers {
24 1 50   1 1 81 $_[0][0] == 200 or return;
25 1         3 my $h = $_[0][1];
26 1         4 push @$h, 'Cache-Control', 'max-age=' . ONE_YEAR . ', public';
27 1         3 my $now = time;
28 1 50       5 $cached_time == $now or $cached_stamp = imf_fixdate ONE_YEAR + ( $cached_time = $now );
29 1         40 Plack::Util::header_set( $h, Expires => $cached_stamp );
30             }
31              
32 1     1 1 25091 sub call { Plack::Util::response_cb( &{ shift->app }, \&inject_headers ) }
  1         9  
33              
34             1;
35              
36             __END__