Class: RailsErrorDashboard::Middleware::RateLimiter
- Inherits:
-
Object
- Object
- RailsErrorDashboard::Middleware::RateLimiter
- Defined in:
- lib/rails_error_dashboard/middleware/rate_limiter.rb
Overview
Rate limiting middleware for Rails Error Dashboard routes Protects both dashboard UI and API endpoints from abuse
Constant Summary collapse
- API_LIMIT =
Rate limits by endpoint type (relative to engine mount path)
{ limit: 100, period: 60 }.freeze
- DASHBOARD_LIMIT =
100 req/min
{ limit: 300, period: 60 }.freeze
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app) ⇒ RateLimiter
constructor
300 req/min.
Constructor Details
#initialize(app) ⇒ RateLimiter
300 req/min
12 13 14 15 |
# File 'lib/rails_error_dashboard/middleware/rate_limiter.rb', line 12 def initialize(app) @app = app @cache = Rails.cache end |
Instance Method Details
#call(env) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/rails_error_dashboard/middleware/rate_limiter.rb', line 17 def call(env) return @app.call(env) unless enabled? request = Rack::Request.new(env) # Only apply rate limiting to error dashboard routes return @app.call(env) unless error_dashboard_route?(request.path) # Find matching rate limit configuration limit_config = find_limit_config(request.path) return @app.call(env) unless limit_config # Check rate limit key = rate_limit_key(request) current_count = @cache.read(key).to_i if current_count >= limit_config[:limit] return rate_limit_response(request, limit_config) end # Increment counter with expiration @cache.write(key, current_count + 1, expires_in: limit_config[:period].seconds) @app.call(env) end |