public void UpdateBaseUrls(string[] baseUrls) { var dict = baseUrls .Distinct() .ToDictionary(x => x, _ => WeightItem.CreateDefaultItem()); UrlResourceManager.UpdateResources(dict); }
private Task <IReadOnlyList <RetryActionResult <string, HttpResponseMessage> > > SendAsyncWithDiag( string url, Func <string, Task <HttpResponseMessage> > send) { return(UrlResourceManager.ExecuteAsyncWithDiag(async(source, _) => { var combinedUrl = $"{source.TrimEnd('/')}/{url.TrimStart('/')}"; // Special timeout handling for HttpClient using (var cts = new CancellationTokenSource()) { if (Timeout.HasValue) { cts.CancelAfter(Timeout.Value); } try { var res = await send(combinedUrl); if (IsTransientHttpStatusCode(res.StatusCode)) { throw new TransientHttpRequestException( url, combinedUrl, res, $"Response status code does not indicate success: ${res.StatusCode}"); } if (!res.IsSuccessStatusCode) { throw new HttpErrorResponseException( url, combinedUrl, res); } var errorCode = _isErrorResponse(res, await res.Content.ReadAsStringAsync()); if (errorCode > 0) { throw new HttpErrorResponseException( url, combinedUrl, res); } return res; } catch (HttpRequestException e) { throw new ServiceUnavailableException(url, combinedUrl, e.Message, e); } catch (TaskCanceledException e) when(!cts.Token.IsCancellationRequested) { throw new RequestTimeoutException(url, combinedUrl, "Operation timeout", e); } } }, _shouldRetry, RaiseOnError)); }