public List <RateLimitRule> GetMatchingGeneralRules(ClientRequest clientRequest) { if (_options.GeneralRules == null || !_options.GeneralRules.Any()) { return(null); } var result = new List <RateLimitRule>(); var rulePeriodComparer = new RateLimitRule.PeriodComparer(); if (_options.EnableEndpointRateLimiting) { var endpointRules = _options.GeneralRules.GetEndpointRules(clientRequest.HttpVerb, clientRequest.Path); result.AddRange(endpointRules); } var globalRules = _options.GeneralRules.GetGlobalRules(clientRequest.HttpVerb); result.AddRange(globalRules.Except(result, rulePeriodComparer)); return(result); }
public override List <RateLimitRule> GetMatchingRules(ClientRequest clientRequest) { var result = new List <RateLimitRule>(); var rulePeriodComparer = new RateLimitRule.PeriodComparer(); // get matching client rules var policy = _policyStore.Get($"{_options.ClientPolicyPrefix}_{clientRequest.ClientId}"); if (policy?.Rules != null && policy.Rules.Any()) { if (_options.EnableEndpointRateLimiting) { var endpointRules = policy.Rules.GetEndpointRules(clientRequest.HttpVerb, clientRequest.Path); result.AddRange(endpointRules); } // add client specific global rules where no rule exists for period var globalRules = policy.Rules.GetGlobalRules(clientRequest.HttpVerb); result.AddRange(globalRules.Except(result, rulePeriodComparer)); } // add general rules where no rule exists for period var generalRules = GetMatchingGeneralRules(clientRequest); if (generalRules != null) { result.AddRange(generalRules.Except(result, rulePeriodComparer)); } // order by period result = result.OrderBy(x => x.PeriodTimeSpan).ToList(); if (_options.StackBlockedRequests) { result.Reverse(); } return(result); }