Skip to content
This repository
tree: cea432ea86
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 86 lines (61 sloc) 1.981 kb
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
package Plack::Middleware::AccessLog::Timed;
use strict;
use warnings;
use base 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($status, $header, $body) = @{$self->app->($env)};

    my $timer_body = Plack::Util::inline_object(
        getline => sub {
            my $line;
            if (ref $body eq 'ARRAY') {
                $line = shift @$body;
            } else {
                $line = $body->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 }) );
        },
    );

    return [ $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::Middleware qw(AccessLog::Timed);
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
Something went wrong with that request. Please try again.