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);
        }