File Coverage

blib/lib/Pod/Webserver/Connection.pm
Criterion Covered Total %
statement 31 33 93.9
branch 1 2 50.0
condition 1 3 33.3
subroutine 8 8 100.0
pod 0 5 0.0
total 41 51 80.3


line stmt bran cond sub pod time code
1             package Pod::Webserver::Connection;
2              
3 3     3   13 use strict;
  3         4  
  3         98  
4 3     3   12 use warnings;
  3         4  
  3         72  
5              
6 3     3   943 use Pod::Webserver::Request;
  3         94  
  3         1657  
7              
8             our $VERSION = '3.09';
9              
10             # ------------------------------------------------
11              
12             sub close {
13 5     5 0 775 close $_[0]->{__fh};
14              
15             } # End of close.
16              
17             # ------------------------------------------------
18              
19             sub get_request {
20 2     2 0 877 my $self = shift;
21              
22 2         10 my $fh = $self->{__fh};
23              
24 2         134 my $line = <$fh>;
25 2 50 33     57 if (!defined $line or !($line =~ m!^([A-Z]+)\s+(\S+)\s+HTTP/1\.\d+!)) {
26 0         0 $self->send_error(400);
27 0         0 return;
28             }
29              
30 2         32 return Pod::Webserver::Request->new(method=>$1, url=>$2);
31              
32             } # End of get_request.
33              
34             # ------------------------------------------------
35              
36             sub new {
37 5     5 0 3182 my ($class, $fh) = @_;
38              
39 5         60 return bless {__fh => $fh}, $class
40              
41             } # End of new.
42              
43             # ------------------------------------------------
44              
45             sub send_error {
46 1     1 0 314 my ($self, $status_code) = @_;
47              
48 1         10 my $message = "HTTP/1.0 $status_code HTTP error code $status_code\n" .
49             "Date: " . Pod::Webserver::time2str(time) . "\n" . <<"EOM";
50             Content-Type: text/plain
51              
52             Something went wrong, generating code $status_code.
53             EOM
54              
55 1         8 $message =~ s/\n/\15\12/gs;
56              
57 1         2 print {$self->{__fh}} $message;
  1         17  
58              
59             } # End of send_error.
60              
61             # ------------------------------------------------
62              
63             sub send_response {
64 2     2 0 353 my ($self, $response) = @_;
65              
66 2         16 my $message = "HTTP/1.0 200 OK\n"
67             . "Date: " . Pod::Webserver::time2str(time) . "\n"
68             . "Content-Type: $response->{content_type}\n";
69              
70             # This is destructive, but for our local purposes it doesn't matter
71 2         6 while (my ($name, $value) = splice @{$response->{header}}, 0, 2) {
  5         28  
72 3         15 $message .= "$name: $value\n";
73             }
74              
75 2         62 $message .= "\n$response->{content}";
76              
77 2         227 $message =~ s/\n/\15\12/gs;
78              
79 2         6 print {$self->{__fh}} $message;
  2         148  
80              
81             } # End of send_response.
82              
83             # ------------------------------------------------
84              
85             1;