File Coverage

blib/lib/Klonk/Env.pm
Criterion Covered Total %
statement 9 68 13.2
branch 0 34 0.0
condition 0 10 0.0
subroutine 3 9 33.3
pod 4 4 100.0
total 16 125 12.8


line stmt bran cond sub pod time code
1             package Klonk::Env 0.01;
2 1     1   359832 use Klonk::pragma;
  1         3  
  1         6  
3 1     1   991 use Unicode::UTF8 qw(decode_utf8);
  1         819  
  1         87  
4              
5             use constant {
6 1         401 MAX_FORM_BODY_SIZE => 10 * 1024 * 1024,
7 1     1   6 };
  1         1  
8              
9 0 0   0     fun _parse_query($query_string) {
  0 0          
  0            
  0            
10 0           my %param;
11 0           for my $kv (split /&/, $query_string) {
12 0           my ($k, $v) = split /=/, $kv, 2;
13 0           for ($k, $v) {
14 0 0         defined or next;
15 0           tr/+/ /;
16 0           s/%([[:xdigit:]]{2})/chr hex $1/eg;
  0            
17 0           $_ = decode_utf8 $_;
18             }
19 0           $param{$k} = $v;
20             }
21 0           \%param
22             }
23              
24 0 0   0 1   method new($class: $env) {
  0 0          
  0            
  0            
  0            
25 0           my $qparam = _parse_query $env->{QUERY_STRING};
26              
27 0           my $bparam = {};
28             {
29 0           my $verb = $env->{REQUEST_METHOD};
  0            
30 0 0 0       if ($verb eq 'POST' || $verb eq 'PUT' || $verb eq 'PATCH') {
      0        
31 0   0       my $ctype = $env->{CONTENT_TYPE} // '';
32 0   0       my $clength = $env->{CONTENT_LENGTH} // 0;
33 0 0         $clength <= MAX_FORM_BODY_SIZE
34             or die "Request size ($clength) exceeds maximum form size";
35 0 0         if ($ctype eq 'application/x-www-form-urlencoded') {
36 0           my $input = $env->{'psgi.input'};
37 0           my $query = '';
38 0           while ((my $d = $clength - length($query)) > 0) {
39 0 0         my $n = $input->read($query, $d, length($query))
40             and next;
41 0 0         defined $n
42 0           and die "Premature end of request body (received ${\length $query} of $clength bytes)";
43 0           die "Error while reading request body: $!";
44             }
45 0           $bparam = _parse_query $query;
46             }
47             }
48             }
49              
50             bless {
51 0           %$env,
52             'klonk.qparam' => $qparam,
53             'klonk.bparam' => $bparam,
54             }, $class
55             }
56              
57 0 0   0     method DESTROY(@) {}
  0            
  0            
58              
59 0 0   0 1   method vpath($path) {
  0 0          
  0            
  0            
  0            
60 0           $self->{SCRIPT_NAME} . '/' . $path =~ s!^/!!r
61             }
62              
63 0 0   0 1   method qparam($k) {
  0 0          
  0            
  0            
  0            
64 0           $self->{'klonk.qparam'}{$k}
65             }
66              
67 0 0   0 1   method bparam($k) {
  0 0          
  0            
  0            
  0            
68 0           $self->{'klonk.bparam'}{$k}
69             }
70              
71             1
72             __END__