summaryrefslogtreecommitdiff
path: root/lib/api/helpers/rate_limiter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/api/helpers/rate_limiter.rb')
-rw-r--r--lib/api/helpers/rate_limiter.rb27
1 files changed, 14 insertions, 13 deletions
diff --git a/lib/api/helpers/rate_limiter.rb b/lib/api/helpers/rate_limiter.rb
index 3a16aef6a74..7d87c74097d 100644
--- a/lib/api/helpers/rate_limiter.rb
+++ b/lib/api/helpers/rate_limiter.rb
@@ -2,26 +2,27 @@
module API
module Helpers
+ # == RateLimiter
+ #
+ # Helper that checks if the rate limit for a given endpoint is throttled by calling the
+ # Gitlab::ApplicationRateLimiter class. If the action is throttled for the current user, the request
+ # will be logged and an error message will be rendered with a Too Many Requests response status.
+ # See app/controllers/concerns/check_rate_limit.rb for Rails controllers version
module RateLimiter
- def check_rate_limit!(key, scope, users_allowlist = nil)
- if rate_limiter.throttled?(key, scope: scope, users_allowlist: users_allowlist)
- log_request(key)
- render_exceeded_limit_error!
- end
- end
+ def check_rate_limit!(key, scope:, **options)
+ return unless rate_limiter.throttled?(key, scope: scope, **options)
- private
+ rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
- def rate_limiter
- ::Gitlab::ApplicationRateLimiter
- end
+ return yield if block_given?
- def render_exceeded_limit_error!
render_api_error!({ error: _('This endpoint has been requested too many times. Try again later.') }, 429)
end
- def log_request(key)
- rate_limiter.log_request(request, "#{key}_request_limit".to_sym, current_user)
+ private
+
+ def rate_limiter
+ ::Gitlab::ApplicationRateLimiter
end
end
end