class Nexaas::Throttle::Middleware
Public Class Methods
new(app)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 45 def initialize(app) @app = app end
Public Instance Methods
call(env)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 49 def call(env) status, headers, body = Rack::Attack.new(@app).call(env) headers.merge!(rate_limit_headers(env)) if rate_limit_available?(env) [status, headers, body] end
Private Instance Methods
limit(limit_data)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 82 def limit(limit_data) limit_data[:limit].to_s end
limit_data(env)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 76 def limit_data(env) data = env["rack.attack.match_data"] data ||= (env["rack.attack.throttle_data"] || {})["nexaas/throttle"] data || {} end
rack_attack_key()
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 57 def rack_attack_key "rack.attack.throttle_data" end
rate_limit_available?(env)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 61 def rate_limit_available?(env) env.key?(rack_attack_key) && env[rack_attack_key].key?("nexaas/throttle") end
rate_limit_headers(env)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 65 def rate_limit_headers(env) data = limit_data(env) return {} if data[:period].nil? { "X-RateLimit-Limit" => limit(data), "X-RateLimit-Reset" => reset(data), "X-RateLimit-Remaining" => remaining(data) } end
remaining(limit_data)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 92 def remaining(limit_data) (limit_data[:limit].to_i - limit_data[:count].to_i).to_s end
reset(limit_data)
click to toggle source
# File lib/nexaas/throttle/middleware.rb, line 86 def reset(limit_data) now = Time.now.utc period = limit_data[:period] (now + (period - now.to_i % period)).iso8601.to_s end