module RailsRateLimiter

Provides `rate_limit` callback to limit amount of requests and handle rate limit exceeding

Constants

VERSION

Public Class Methods

included(base) click to toggle source
# File lib/rails_rate_limiter.rb, line 10
def self.included(base)
  base.extend ClassMethods
end

Private Instance Methods

check_rate_limits(strategy, limit, per, pattern, client, block) click to toggle source
# File lib/rails_rate_limiter.rb, line 58
def check_rate_limits(strategy, limit, per, pattern, client, block)
  requester = compute_requester_pattern(pattern || request.remote_ip)

  strategy_class =
    "RailsRateLimiter::Strategies::#{strategy.classify}".constantize
  result = strategy_class.new(limit, per, requester, client).run
  return unless result.limit_exceeded?
  # instance_exec is using here because simple block.call executes block in
  # a wrong context that leads to not preventing action execution after render
  instance_exec result, &block
end
compute_requester_pattern(requester) click to toggle source
# File lib/rails_rate_limiter.rb, line 70
def compute_requester_pattern(requester)
  return "ip_#{requester}" unless requester.respond_to?(:call)
  # instance_exec is using here because simple block.call executes block in
  # a wrong context that leads to not preventing action execution after render
  "custom_#{instance_exec(&requester)}"
end