File Coverage

blib/lib/Plack/Middleware/Throttle/Lite/Backend/Redis.pm
Criterion Covered Total %
statement 41 49 83.6
branch 13 20 65.0
condition 8 17 47.0
subroutine 8 10 80.0
pod 3 3 100.0
total 73 99 73.7


line stmt bran cond sub pod time code
1             package Plack::Middleware::Throttle::Lite::Backend::Redis;
2              
3             # ABSTRACT: Redis-driven storage backend for Throttle-Lite
4              
5 1     1   197281 use strict;
  1         3  
  1         27  
6 1     1   4 use warnings;
  1         2  
  1         1126  
7 1     1   5 use Carp ();
  1         1  
  1         15  
8 1     1   4 use parent 'Plack::Middleware::Throttle::Lite::Backend::Abstract';
  1         1  
  1         5  
9 1     1   19056 use Redis 1.955;
  1         85619  
  1         676  
10              
11             our $VERSION = '0.04'; # VERSION
12             our $AUTHORITY = 'cpan:CHIM'; # AUTHORITY
13              
14             __PACKAGE__->mk_attrs(qw(redis rdb));
15              
16             sub init {
17 17     17 1 84416 my ($self, $args) = @_;
18              
19 17     17   90 my $croak = sub { Carp::croak $_[0] };
  17         313  
20              
21 17   50     461 my %options = (
      50        
      50        
22             debug => $args->{debug} || 0,
23             reconnect => $args->{reconnect} || 10,
24             every => $args->{every} || 100,
25             );
26              
27 17 50       56 $options{password} = $args->{password} if $args->{password};
28              
29 17         81 my $instance = $self->_parse_instance($args->{instance});
30              
31 17 100       213 if ($instance->{unix}) {
32 3 50 33     243 $croak->("Nonexistent redis socket ($instance->{thru})!") unless -e $instance->{thru} && -S _;
33             }
34              
35 14 50       67 $options{ $instance->{unix} ? 'sock' : 'server' } = $instance->{thru};
36              
37 14   50     113 $self->rdb($args->{database} || 0);
38              
39 14         541 my $_handle = eval { Redis->new(%options) };
  14         118  
40 14 50 33     142084196 $croak->("Cannot get redis handle: ". ($@ || $instance->{thru})) unless ref($_handle) eq 'Redis';
41              
42 0         0 $self->redis($_handle);
43             }
44              
45             sub _parse_instance {
46 17     17   34 my ($self, $instance) = @_;
47              
48 17         80 my $params = { unix => 0, thru => '127.0.0.1:6379' };
49              
50             # slightly improved piece of code from Redis.pm by Pedro Melo (cpan:MELO)
51 17 100       60 CHANCE: {
52 17         35 last CHANCE unless $instance;
53              
54 16 100       403 if ($instance =~ m,^(unix:)?(/.+)$,i) {
55 3         12 $params->{thru} = $2;
56 3         4 $params->{unix} = 1;
57 3         7 last CHANCE;
58             }
59 13 50       124 if ($instance =~ m,^((tcp|inet):)?(.+)$,i) {
60 13         62 my ($server, $port) = ($3, undef);
61 13         67 ($server, $port) = split /:/, $server;
62 13 100 66     137 $params->{thru} = lc($server) . ':' . (($port && ($port > 0 && $port <= 65535)) ? $port : '6379');
63             }
64             }
65              
66 17         40 $params;
67             }
68              
69             sub increment {
70 0     0 1   my ($self) = @_;
71              
72 0           $self->redis->select($self->rdb);
73 0           $self->redis->incr($self->cache_key);
74 0           $self->redis->expire($self->cache_key, 1 + $self->expire_in);
75              
76             }
77              
78             sub reqs_done {
79 0     0 1   my ($self) = @_;
80              
81 0           $self->redis->select($self->rdb);
82 0 0         $self->redis->get($self->cache_key) || 0;
83             }
84              
85             1; # End of Plack::Middleware::Throttle::Lite::Backend::Redis
86              
87             __END__