/usr/share/perl5/Plack/Middleware/AccessLog/Timed.pm is in libplack-perl 0.9985-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | package Plack::Middleware::AccessLog::Timed;
use strict;
use warnings;
use parent qw( Plack::Middleware::AccessLog );
use Time::HiRes;
use Plack::Util;
sub call {
my $self = shift;
my($env) = @_;
my $time = Time::HiRes::gettimeofday;
my $length = 0;
my $logger = $self->logger || sub { $env->{'psgi.errors'}->print(@_) };
my $res = $self->app->($env);
return $self->response_cb($res, sub {
my $res = shift;
my($status, $header, $body) = @$res;
if (!defined $body) {
$logger->( $self->log_line($status, $header, $env) );
return;
}
my $getline = ref $body eq 'ARRAY' ? sub { shift @$body } : sub { $body->getline };
my $timer_body = Plack::Util::inline_object(
getline => sub {
my $line = $getline->();
$length += length $line if defined $line;
return $line;
},
close => sub {
$body->close if ref $body ne 'ARRAY';
my $now = Time::HiRes::gettimeofday;
$logger->( $self->log_line($status, $header, $env, { time => $now - $time, content_length => $length }) );
},
);
@$res = ($status, $header, $timer_body);
});
}
1;
__END__
=head1 NAME
Plack::Middleware::AccessLog::Timed - Logs requests with time and accurate body size
=head1 SYNOPSIS
# in app.psgi
use Plack::Builder;
builder {
enable "Plack::Middleware::AccessLog::Timed",
format => "%v %h %l %u %t \"%r\" %>s %b %D";
$app;
};
=head1 DESCRIPTION
Plack::Middleware::AccessLog::Timed is a subclass of
Plack::Middleware::AccessLog but uses a wrapped body handle to get the
actual response body size C<%b> (even if it's not a chunk of array or
a real filehandle) and the time taken to serve the request: C<%T> or
C<%D>.
This wraps the response body output stream so some server
optimizations like sendfile(2) will be disabled if you use this
middleware.
=head1 CONFIGURATION
Same as L<Plack::Middleware::AccessLog>.
=head1 AUTHOR
Tatsuhiko Miyagawa
=head1 SEE ALSO
L<Plack::Middleware::AccessLog>
=cut
|