File Coverage

blib/lib/Gopher/Server/RequestHandler/File.pm
Criterion Covered Total %
statement 19 42 45.2
branch 0 6 0.0
condition 0 8 0.0
subroutine 7 11 63.6
pod n/a
total 26 67 38.8


line stmt bran cond sub pod time code
1              
2             package Gopher::Server::RequestHandler::File;
3 1     1   1197 use strict;
  1         2  
  1         28  
4 1     1   5 use warnings;
  1         2  
  1         21  
5 1     1   474 use Gopher::Server::Response;
  1         3  
  1         29  
6 1     1   5 use base 'Gopher::Server::RequestHandler';
  1         1  
  1         347  
7              
8              
9             sub new
10             {
11 0     0     my ($class, $in) = @_;
12              
13 0 0         die "Need a hashref" unless ref($in) eq 'HASH';
14              
15 0   0       my $root = $in->{root} || die "Need a root for the server";
16 0   0       my $host = $in->{host} || die "Need a host for the server";
17 0   0       my $port = $in->{port} || die "Need a port for the server";
18              
19 0           my $self = {
20             root => $root,
21             host => $host,
22             port => $port,
23             };
24 0           bless $self, $class;
25             }
26              
27 0     0     sub root { $_[0]->{root} }
28              
29              
30             sub process
31             {
32 0     0     my ($self, $request) = @_;
33              
34 0           my $path = $self->_canonpath( $request->selector );
35              
36 0           my $response;
37 0 0         if( -d $path ) { # Directory, send back menu
    0          
38 0           $response = $self->_make_menu( $path, $request );
39             }
40             elsif( -e $path ) { # File, return its contents
41 0           $response = $self->_make_file( $path, $request );
42             }
43             else { # Nothing found
44             }
45              
46 0           return $response;
47             }
48              
49              
50             sub _canonpath
51             {
52 0     0     my $self = shift;
53 0   0       my $want = shift || '/';
54 0           my $root = $self->root;
55              
56 1     1   6 use File::Spec;
  1         12  
  1         152  
57 0           my @splitpath = File::Spec->splitdir($want);
58 0           my @splitpath_clean = File::Spec->no_upwards(@splitpath);
59 0           return File::Spec->canonpath(
60             File::Spec->join( $root, @splitpath_clean )
61             );
62             }
63              
64             sub _make_menu
65             {
66             my ($self, $path, $request) = @_;
67              
68             my $selector = $request->selector;
69             opendir( my $dir, $path ) or die "Can't open directory $path: $!\n";
70              
71             my @menu_items;
72             foreach my $dir_item (readdir($dir)) {
73 1     1   495 use Gopher::Server::TypeMapper;
  1         2  
  1         52  
74             my $item_type = Gopher::Server::TypeMapper->get_type({
75             filename => "$path/$dir_item",
76             });
77              
78 1     1   507 use Net::Gopher::Response::MenuItem;
  0            
  0            
79             my $item_selector = $selector . "/$dir_item";
80             push @menu_items, Net::Gopher::Response::MenuItem->new({
81             #request => $request,
82             ItemType => $item_type->gopher_type,
83             Display => $dir_item,
84             Selector => $item_selector,
85             Host => $self->{host},
86             Port => $self->{port},
87             });
88             }
89              
90             return Gopher::Server::Response->new({
91             request => $request,
92             menu_items => \@menu_items,
93             });
94             }
95              
96             sub _make_file
97             {
98             my ($self, $path, $request) = @_;
99              
100             open(my $fh, '<', $path) or die "Can't open $path: $!\n";
101              
102             return Gopher::Server::Response->new({
103             request => $request,
104             fh => $fh,
105             });
106             }
107              
108              
109             1;
110             __END__