in src/main/java/com/googlesource/gerrit/plugins/quota/RestApiRateLimiter.java [72:109]
public void doFilter(ServletRequest req, ServletResponse res, final FilterChain chain)
throws IOException, ServletException {
if (isRest(req)) {
Holder rateLimiterHolder;
CurrentUser u = user.get();
if (u.isIdentifiedUser()) {
Account.Id accountId = u.asIdentifiedUser().getAccountId();
try {
rateLimiterHolder = limitsPerAccount.get(accountId);
} catch (ExecutionException e) {
rateLimiterHolder = Holder.EMPTY;
log.warn("Cannot get rate limits for account ''{}''", accountId, e);
}
} else {
try {
rateLimiterHolder = limitsPerRemoteHost.get(req.getRemoteHost());
} catch (ExecutionException e) {
rateLimiterHolder = Holder.EMPTY;
log.warn(
"Cannot get rate limits for anonymous access from remote host ''{}''",
req.getRemoteHost(),
e);
}
}
if (!rateLimiterHolder.hasGracePermits()
&& rateLimiterHolder.get() != null
&& !rateLimiterHolder.get().tryAcquire()) {
String msg =
MessageFormat.format(
limitExceededMsg,
rateLimiterHolder.get().getRate() * SECONDS_PER_HOUR,
rateLimiterHolder.getBurstPermits());
((HttpServletResponse) res).sendError(SC_TOO_MANY_REQUESTS, msg);
return;
}
}
chain.doFilter(req, res);
}