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