File Coverage

blib/lib/Kelp/Module/Storage/Abstract/KelpExtensions.pm
Criterion Covered Total %
statement 26 33 78.7
branch 1 10 10.0
condition 1 2 50.0
subroutine 8 9 88.8
pod 0 1 0.0
total 36 55 65.4


line stmt bran cond sub pod time code
1             package Kelp::Module::Storage::Abstract::KelpExtensions;
2             $Kelp::Module::Storage::Abstract::KelpExtensions::VERSION = '1.00';
3 1     1   7 use Kelp::Base -strict;
  1         3  
  1         8  
4              
5 1     1   942 use Kelp::Response;
  1         24458  
  1         77  
6 1     1   10 use Try::Tiny;
  1         2  
  1         70  
7 1     1   6 use Plack::MIME;
  1         6  
  1         26  
8 1     1   5 use HTTP::Date;
  1         2  
  1         77  
9 1     1   8 use Scalar::Util qw(blessed);
  1         3  
  1         494  
10              
11             sub Kelp::Response::render_file
12             {
13 1     1 0 164054 my ($self, $filename) = @_;
14              
15 1         7 my $app = $self->app;
16 1         9 my $fh;
17             my %info;
18 1         0 my $e;
19              
20             try {
21 1     1   58 $fh = $app->storage->retrieve($filename, \%info);
22             }
23             catch {
24 0     0   0 $e = $_;
25 1         14 };
26              
27 1 50       375 if ($e) {
28 0 0       0 die $e unless blessed $e;
29              
30 0 0       0 if ($e->isa('Storage::Abstract::X::NotFound')) {
    0          
31 0         0 return $self->render_error(404);
32             }
33             elsif ($e->isa('Storage::Abstract::X::PathError')) {
34 0         0 return $self->render_error(403);
35             }
36             else {
37             # StorageError or HandleError
38 0 0       0 $app->logger(error => "Rendering file failed: $e") if $app->can('logger');
39 0         0 return $self->render_error(500);
40             }
41             }
42              
43             return $self
44             ->set_header('Content-Type', Plack::MIME->mime_type($filename) || 'text/plain')
45             ->set_header('Content-Length', $info{size})
46 1   50     11 ->set_header('Last-Modified', HTTP::Date::time2str($info{mtime}))
47             ->render_binary($fh);
48             }
49              
50             1;
51