Exemple #1
0
        public static void RequestProcessing(HttpContext httpContext)
        {
            if (!Configurationed)
            {
                return;
            }

            // check if rate limiting is enabled
            if (Options == null)
            {
                return;
            }

            // compute identity from request
            var identity = SetIdentity(httpContext);

            // check white list
            if (Processor.IsWhitelisted(identity))
            {
                return;
            }

            var rules = Processor.GetMatchingRules(identity);

            foreach (var rule in rules)
            {
                if (rule.Limit > 0)
                {
                    // increment counter
                    var counter = Processor.ProcessRequest(identity, rule);

                    // check if key expired
                    if (counter.Timestamp + rule.PeriodTimespan.Value < DateTime.UtcNow)
                    {
                        continue;
                    }

                    // check if limit is reached
                    if (counter.TotalRequests > rule.Limit)
                    {
                        //compute retry after value
                        var retryAfter = Processor.RetryAfterFrom(counter.Timestamp, rule);

                        // log blocked request
                        LogBlockedRequest(httpContext, identity, counter, rule);

                        // break execution
                        ReturnQuotaExceededResponse(httpContext, rule, retryAfter);

                        return;
                    }
                }
            }

            //set X-Rate-Limit headers for the longest period
            if (rules.Any() && !Options.DisableRateLimitHeaders)
            {
                var rule    = rules.OrderByDescending(x => x.PeriodTimespan.Value).First();
                var headers = Processor.GetRateLimitHeaders(identity, rule);

                httpContext.Response.Headers["X-Rate-Limit-Limit"]     = headers.Limit;
                httpContext.Response.Headers["X-Rate-Limit-Remaining"] = headers.Remaining;
                httpContext.Response.Headers["X-Rate-Limit-Reset"]     = headers.Reset;
            }
        }