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
- LIMITS =
Rate limits by endpoint type
{ # API endpoints (mobile/frontend) - stricter limits "/error_dashboard/api" => { limit: 100, period: 60 }, # 100 req/min # Dashboard pages (human users) - more lenient "/error_dashboard" => { limit: 300, period: 60 } # 300 req/min }.freeze
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app) ⇒ RateLimiter
constructor
A new instance of RateLimiter.
Constructor Details
#initialize(app) ⇒ RateLimiter
Returns a new instance of RateLimiter.
17 18 19 20 |
# File 'lib/rails_error_dashboard/middleware/rate_limiter.rb', line 17 def initialize(app) @app = app @cache = Rails.cache end |
Instance Method Details
#call(env) ⇒ Object
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/rails_error_dashboard/middleware/rate_limiter.rb', line 22 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 |