discourse/lib/request_tracker/rate_limiters/stack.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

68 lines
1.8 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module RequestTracker
module RateLimiters
# :nodoc:
class Stack
def initialize
@rate_limiter_klasses = []
end
def to_s
@rate_limiter_klasses.map { |klass| klass.to_s }.join(", ")
end
def include?(reference_klass)
@rate_limiter_klasses.include?(reference_klass)
end
def prepend(rate_limiter_klass)
@rate_limiter_klasses.prepend(rate_limiter_klass)
end
def append(rate_limiter_klass)
@rate_limiter_klasses.append(rate_limiter_klass)
end
def insert_before(existing_rate_limiter_klass, new_rate_limiter_klass)
@rate_limiter_klasses.insert(
get_rate_limiter_index(existing_rate_limiter_klass),
new_rate_limiter_klass,
)
end
def insert_after(existing_rate_limiter_klass, new_rate_limiter_klass)
@rate_limiter_klasses.insert(
get_rate_limiter_index(existing_rate_limiter_klass) + 1,
new_rate_limiter_klass,
)
end
def active_rate_limiter(request, cookie)
@rate_limiter_klasses.each do |rate_limiter_klass|
rate_limiter = rate_limiter_klass.new(request, cookie)
return rate_limiter if rate_limiter.active?
end
nil
end
def method_missing(method_name, *args, &block)
if @rate_limiter_klasses.respond_to?(method_name)
@rate_limiter_klasses.send(method_name, *args, &block)
else
super
end
end
private
def get_rate_limiter_index(rate_limiter_klass)
index = @rate_limiter_klasses.index { |klass| klass == rate_limiter_klass }
raise "Rate limiter #{rate_limiter_klass} not found" if index.nil?
index
end
end
end
end