// ** Rule 1 **// public bool ReachedMaxReuestPerTimeSpan(DateTime now) { bool IsRestricted = false; if (this._firstCallTime == new DateTime(0001, 1, 1)) { this._firstCallTime = now; } if (this._clientRequestsCountInTimespan == this._allowedrequestCountsPerTimespan && now - this._firstCallTime < this._allowedTimeSpan) { IsRestricted = true; } else if (this._clientRequestsCountInTimespan == this._allowedrequestCountsPerTimespan && now - this._firstCallTime > this._allowedTimeSpan) { IsRestricted = true; } else if (now - this._firstCallTime > this._allowedTimeSpan) { CountCallsForClientsInTimspan[AuthToken] = 0; if (FirstCallTimeForClientsInTimeSpan.ContainsKey(AuthToken)) { FirstCallTimeForClientsInTimeSpan[AuthToken] = now; } else { FirstCallTimeForClientsInTimeSpan.Add(AuthToken, now); } } return(IsRestricted); }
// Initializing the parameters in the constructor public RateLimiter(string authToken, TimeSpan timeSpanPastSinceLastCall, TimeSpan allowedTimeSpan, int AllowedrequestCountsPerTimespan) { this._authToken = authToken; // parameters for X request per timespan this._allowedrequestCountsPerTimespan = AllowedrequestCountsPerTimespan; if (CountCallsForClientsInTimspan.ContainsKey(AuthToken)) { this._clientRequestsCountInTimespan = CountCallsForClientsInTimspan[AuthToken]; } if (FirstCallTimeForClientsInTimeSpan.ContainsKey(AuthToken)) { this._firstCallTime = FirstCallTimeForClientsInTimeSpan[AuthToken]; } this._allowedTimeSpan = allowedTimeSpan; // parameters for a certain timespan passed since the last call; this._timeSpanPastSinceLastCall = timeSpanPastSinceLastCall; if (LastCallTimeForClients.ContainsKey(AuthToken)) { this._lastCallTime = LastCallTimeForClients[AuthToken]; } }