public string RetryAfterFrom(DateTime timestamp, RateLimitRule rule) { return(_core.RetryAfterFrom(timestamp, rule)); }
public RateLimitHeaders GetRateLimitHeaders(ClientRequestIdentity requestIdentity, RateLimitRule rule) { return(_core.GetRateLimitHeaders(requestIdentity, rule)); }
public RateLimitCounter ProcessRequest(ClientRequestIdentity requestIdentity, RateLimitRule rule) { return(_core.ProcessRequest(requestIdentity, rule)); }
public virtual void LogBlockedRequest(HttpContext httpContext, ClientRequestIdentity identity, RateLimitCounter counter, RateLimitRule rule) { _logger.LogInformation($"Request {identity.HttpVerb}:{identity.Path} from ClientId {identity.ClientId} has been blocked, quota {rule.Limit}/{rule.Period} exceeded by {counter.TotalRequests}. Blocked by rule {rule.UrlRegex}, TraceIdentifier {httpContext.TraceIdentifier}."); }
public RateLimitCounter ProcessRequest(ClientRequestIdentity requestIdentity, RateLimitRule rule) { var counter = new RateLimitCounter { Timestamp = DateTime.UtcNow, TotalRequests = 1 }; var counterId = ComputeCounterKey(requestIdentity, rule); // serial reads and writes lock (_processLocker) { var entry = _counterStore.Get(counterId); if (entry.HasValue) { // entry has not expired if (entry.Value.Timestamp + rule.PeriodTimespan.Value >= DateTime.UtcNow) { // increment request count var totalRequests = entry.Value.TotalRequests + 1; // deep copy counter = new RateLimitCounter { Timestamp = entry.Value.Timestamp, TotalRequests = totalRequests }; } } // stores: id (string) - timestamp (datetime) - total_requests (long) _counterStore.Set(counterId, counter, rule.PeriodTimespan.Value); } return(counter); }
public RateLimitHeaders GetRateLimitHeaders(ClientRequestIdentity requestIdentity, RateLimitRule rule) { var headers = new RateLimitHeaders(); var counterId = ComputeCounterKey(requestIdentity, rule); var entry = _counterStore.Get(counterId); if (entry.HasValue) { headers.Reset = (entry.Value.Timestamp + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo); headers.Limit = rule.Period; headers.Remaining = (rule.Limit - entry.Value.TotalRequests).ToString(); } else { headers.Reset = (DateTime.UtcNow + ConvertToTimeSpan(rule.Period)).ToUniversalTime().ToString("o", DateTimeFormatInfo.InvariantInfo); headers.Limit = rule.Period; headers.Remaining = rule.Limit.ToString(); } return(headers); }