# File lib/rack/attack/cache.rb, line 7 def initialize self.store = ::Rails.cache if defined?(::Rails.cache) @prefix = 'rack::attack' end
# File lib/rack/attack/cache.rb, line 17 def count(unprefixed_key, period) key, expires_in = key_and_expiry(unprefixed_key, period) do_count(key, expires_in) end
# File lib/rack/attack/cache.rb, line 35 def delete(unprefixed_key) store.delete("#{prefix}:#{unprefixed_key}") end
# File lib/rack/attack/cache.rb, line 22 def read(unprefixed_key) store.read("#{prefix}:#{unprefixed_key}") end
# File lib/rack/attack/cache.rb, line 30 def reset_count(unprefixed_key, period) key, _ = key_and_expiry(unprefixed_key, period) store.delete(key) end
# File lib/rack/attack/cache.rb, line 13 def store=(store) @store = StoreProxy.build(store) end
# File lib/rack/attack/cache.rb, line 26 def write(unprefixed_key, value, expires_in) store.write("#{prefix}:#{unprefixed_key}", value, :expires_in => expires_in) end
# File lib/rack/attack/cache.rb, line 48 def do_count(key, expires_in) result = store.increment(key, 1, :expires_in => expires_in) # NB: Some stores return nil when incrementing uninitialized values if result.nil? store.write(key, 1, :expires_in => expires_in) end result || 1 end
# File lib/rack/attack/cache.rb, line 41 def key_and_expiry(unprefixed_key, period) epoch_time = Time.now.to_i # Add 1 to expires_in to avoid timing error: http://git.io/i1PHXA expires_in = (period - (epoch_time % period) + 1).to_i ["#{prefix}:#{(epoch_time / period).to_i}:#{unprefixed_key}", expires_in] end