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