Plack-Middleware-Cache-CHI
view release on metacpan or search on metacpan
lib/Plack/Middleware/Cache/CHI.pm view on Meta::CPAN
use strict;
package Plack::Middleware::Cache::CHI;
our $AUTHORITY = 'cpan:PNU';
# ABSTRACT: Caching Reverse Proxy for Plack
use warnings;
use parent qw/Plack::Middleware/;
use Plack::Util::Accessor qw( chi rules scrub cachequeries trace );
use Data::Dumper;
use Plack::Request;
use Plack::Response;
use Time::HiRes qw( gettimeofday );
our $VERSION = '0.102'; # VERSION
our @trace;
our $timer_call;
our $timer_pass;
sub _uinterval {
my ( $t0, $t1 ) = ( @_, [gettimeofday] );
($t1->[0] - $t0->[0]) * 1_000_000 + $t1->[1] - $t0->[1];
}
sub call {
my ($self,$env) = @_;
## Pass-thru streaming responses
return $self->app->($env)
if ( ref $env eq 'CODE' );
## Localize trace for this request
local @trace = ();
local $timer_pass = undef;
local $timer_call = [gettimeofday];
my $req = Plack::Request->new($env);
my $r = $self->handle($req);
my $res = Plack::Response->new(@$r);
## Add trace and cache key to response headers
$timer_call = _uinterval($timer_call);
my $trace = join q{, }, @trace;
my $key = $self->cachekey($req);
## The subrequest is timed separately
if ( $timer_pass ) {
$timer_call -= $timer_pass;
$res->headers->push_header(
'X-Plack-Cache-Time-Pass' => "$timer_pass us",
);
}
$res->headers->push_header(
'X-Plack-Cache' => $trace,
'X-Plack-Cache-Key' => $key,
'X-Plack-Cache-Time' => "$timer_call us",
);
$res->finalize;
}
sub handle {
my ($self,$req) = @_;
if ( $req->method eq 'GET' or $req->method eq 'HEAD' ) {
if ( $req->headers->header('Expect') ) {
push @trace, 'expect';
$self->pass($req);
} else {
$self->lookup($req);
}
} else {
$self->invalidate($req);
}
}
sub pass {
my ($self,$req) = @_;
push @trace, 'pass';
$timer_pass = [gettimeofday];
my $res = $self->app->($req->env);
$timer_pass = _uinterval($timer_pass);
return $res;
}
( run in 1.404 second using v1.01-cache-2.11-cpan-39bf76dae61 )