internal static RequestLimiter GetRequestLimiter(HttpWebRequest request) { var uriParts = request.RequestUri.AbsoluteUri.Split('/'); string entity = uriParts[uriParts.Length - 1]; string method = uriParts[uriParts.Length - 2]; Key key = new Key(method, entity); mutex.WaitOne(); RequestLimiter requestLimiter; try { requestLimiter = DefaultExecutor.requestLimitGuard.Value[key]; } //Fill requestLimitGuard with requestLimiter if it not exists //Maybe should be in another function catch (KeyNotFoundException) { requestLimiter = new RequestLimiter(); DefaultExecutor.requestLimitGuard.Value.Add(key, requestLimiter); } mutex.ReleaseMutex(); return(requestLimiter); }
public HttpWebResponse Execute(HttpWebRequest request) { RequestLimiter requestLimiter = GetRequestLimiter(request); //Blocks thread until another request is allowed requestLimiter.WaitForAllowing(); return((HttpWebResponse)request.GetResponse()); }
public HttpWebResponse ExecuteWithMaxReqPerSecond(HttpWebRequest request, uint maxReqPerSecond) { if (maxReqPerSecond == 0) { throw new ArgumentException(); } RequestLimiter requestLimiter = GetRequestLimiter(request); //Blocks thread until another request is allowed requestLimiter.WaitForAllowing(maxReqPerSecond); return(this.Execute(request)); }