File Coverage

blib/lib/Plack/Middleware/ServerTiming.pm
Criterion Covered Total %
statement 33 33 100.0
branch 6 6 100.0
condition 2 3 66.6
subroutine 7 7 100.0
pod 1 1 100.0
total 49 50 98.0


line stmt bran cond sub pod time code
1             package Plack::Middleware::ServerTiming;
2 5     5   3340 use strict;
  5         8  
  5         126  
3 5     5   21 use warnings;
  5         8  
  5         128  
4 5     5   383 use parent qw/Plack::Middleware/;
  5         320  
  5         29  
5 5     5   10394 use Plack::Util;
  5         9  
  5         1574  
6              
7             our $VERSION = "0.03";
8              
9             sub call {
10 4     4 1 79317 my ($self, $env) = @_;
11              
12 4         51 my $res = $self->app->($env);
13             $self->response_cb($res, sub {
14 4     4   115 my $res = shift;
15              
16 4 100       21 return unless exists $env->{'psgix.server-timing'};
17              
18 3         6 my @header;
19 3         18 for my $metric (@{$env->{'psgix.server-timing'}}) {
  3         22  
20 10         22 my $name = $metric->[0];
21 10 100       21 my %field = %{$metric->[1] || {}};
  10         47  
22 10         25 my @opt = map { "$_=" . _escape($field{$_}) } grep { defined $field{$_} } qw/dur desc/;
  10         30  
  20         48  
23 10         34 push @header, join ';', $name, @opt;
24             }
25 3         23 Plack::Util::header_set($res->[1], 'Server-Timing', join(', ', @header));
26 4         251 });
27             }
28              
29             sub _escape {
30 10     10   16 my $v = shift;
31 10 100 66     78 if ($v =~ /[\x00-\x20()<>@,;:\\\"\/\[\]?={}\x7F-\xFF]/ || !length($v)) {
32 3         8 $v =~ s/([\"\\])/\\$1/g;
33 3         12 return qq{"$v"};
34             } else {
35 7         25 return $v;
36             }
37             }
38              
39             1;
40             __END__