private void SetHttpHeaders(HttpContext context, APIRateLimiterUserIdServiceResponse response)
 {
     if (ShouldWriteContent(context, response))
     {
         context.Response.Headers.Remove("x-rate-limit-limit");
         context.Response.Headers.Remove("x-rate-limit-remaining");
         context.Response.Headers.Remove("x-rate-limit-reset");
         context.Response.Headers.Add("x-rate-limit-limit", response.Period.ToString());
         context.Response.Headers.Add("x-rate-limit-remaining", response.AvaliableLimit.ToString());
         context.Response.Headers.Add("x-rate-limit-reset", response.ResetIn.ToString("yyyy-MM-dd HH:mm:ss \"GMT\""));
     }
 }
        private bool ShouldWriteContent(HttpContext context, APIRateLimiterUserIdServiceResponse response)
        {
            if (context.Response.Headers.ContainsKey("x-rate-limit-remaining"))
            {
                int    currentlimit  = Convert.ToInt32(context.Response.Headers["x-rate-limit-remaining"].ToString());
                double currentPeriod =
                    Convert.ToDouble(context.Response.Headers["x-rate-limit-limit"].ToString());
                if (currentlimit > response.AvaliableLimit || (currentlimit == response.AvaliableLimit && currentPeriod > response.Period))
                {
                    return(true);
                }

                return(false);
            }

            return(true);
        }
        public void SetHeaderAndBodyIfLimitReached(ActionExecutingContext context, APIRateLimiterUserIdServiceResponse response)
        {
            if (ShouldWriteContent(context.HttpContext, response))
            {
                var jsonString = JsonConvert.SerializeObject(_settings.LimitReachedResponse);
                jsonString = jsonString.Replace("{0}", response.MaxLimit.ToString());
                jsonString = jsonString.Replace("{1}", response.Period.ToString());
                double span = Math.Floor((response.ResetIn - DateTime.UtcNow).TotalSeconds);
                if (span < 0)
                {
                    span = 0;
                }

                jsonString     = jsonString.Replace("{2}", span.ToString());
                context.Result = new ContentResult
                {
                    Content     = jsonString,
                    ContentType = "application/json",
                    StatusCode  = _settings.StatusCode
                };
                SetHttpHeaders(context.HttpContext, response);
            }
        }
 public void SetHeadersIfNotLimitReached(ActionExecutedContext context, APIRateLimiterUserIdServiceResponse response)
 {
     SetHttpHeaders(context.HttpContext, response);
 }