diff options
author | franck cuny <franck@lumberjaph.net> | 2010-03-01 17:56:34 +0100 |
---|---|---|
committer | franck cuny <franck@lumberjaph.net> | 2010-03-01 17:56:34 +0100 |
commit | 46fc47df0eace23987c3a4fa0518f4f87e7897ca (patch) | |
tree | e2c24bfda57972b0f6f44da8314c4c8d5bce894d /lib/Plack/Middleware/APIRateLimit/Backend | |
parent | initial commit (diff) | |
download | plack-middleware-apiratelimit-46fc47df0eace23987c3a4fa0518f4f87e7897ca.tar.gz |
a middleware to throttle request on an API
Diffstat (limited to 'lib/Plack/Middleware/APIRateLimit/Backend')
-rw-r--r-- | lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm | 21 | ||||
-rw-r--r-- | lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm | 43 |
2 files changed, 64 insertions, 0 deletions
diff --git a/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm b/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm new file mode 100644 index 0000000..0e407d8 --- /dev/null +++ b/lib/Plack/Middleware/APIRateLimit/Backend/Hash.pm @@ -0,0 +1,21 @@ +package Plack::Middleware::APIRateLimit::Backend::Hash; + +use Moose; +extends 'Plack::Middleware::APIRateLimit::Backend'; + +has store => ( + is => 'rw', + isa => 'HashRef', + traits => ['Hash'], + lazy => 1, + default => sub { {} }, + handles => { get => 'get', set => 'set' } +); + +sub incr { + my ( $self, $key ) = @_; + my $value = ($self->get($key) || 0) + 1; + $self->set( $key => $value ); +} + +1; diff --git a/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm b/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm new file mode 100644 index 0000000..e647f6a --- /dev/null +++ b/lib/Plack/Middleware/APIRateLimit/Backend/Redis.pm @@ -0,0 +1,43 @@ +package Plack::Middleware::APIRateLimit::Backend::Redis; + +use Moose; +extends 'Plack::Middleware::APIRateLimit::Backend'; + +use AnyEvent::Redis; + +has store => ( + is => 'rw', + isa => 'AnyEvent::Redis', + lazy => 1, + default => sub { + return AnyEvent::Redis->new( + host => '127.0.0.1', + port => 6378, + ); + } +); + +sub BUILD { + my $self = shift; + if (scalar @_) { + $self->store(AnyEvent::Redis->new(@_)); + } + return $self; +} + +sub get { + my ( $self, $key ) = @_; + my $val = $self->store->get($key)->recv; + if ( !$val ) { + $self->store->set( $key => 1 )->recv; + $val = 1; + } + return $val; +} + +sub incr { + my ($self, $key) = @_; + return $self->store->incr($key)->recv; +} + +1; |