internal static HttpClient GetHttpClient(HttpClientConfig config) { lock (_httpClients) { if (_httpClients.TryGetValue(config, out var client)) { return(client); } var handler = new HttpClientHandler { UseCookies = false, AllowAutoRedirect = config.FollowRedirects, }; if (config.SkipCertificateValidation) { handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => true; } client = new HttpClient(handler); _httpClients.Add(config, client); return(client); } }
public static async Task <Response> ExecuteAsync(HttpClientConfig httpClientConfig, RequestData requestData, TimeSpan?timeout = null, CancellationToken cancellationToken = default, IRequestObserver observer = null) { observer = observer ?? Config.DefaultObserver; timeout = timeout ?? Config.DefaultTimeout; // Create a request var request = BuildRequest(requestData); // Observing var requestTag = observer.CreateTag(); observer.BeforeSent(requestTag, requestData, request); // Timeout var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); if (timeout != Timeout.InfiniteTimeSpan) { cts.CancelAfter(timeout.Value); } // Perform the request var stopwatch = Stopwatch.StartNew(); try { var httpClient = Shared.GetHttpClient(httpClientConfig); var response = await httpClient.SendAsync(request, cts.Token).ConfigureAwait(false); observer.OnSent(requestTag, requestData, request, stopwatch.Elapsed); var respData = await response.Content.ReadAsByteArrayAsync().ConfigureAwait(false); var resp = new Response(response, respData); observer.OnReceived(requestTag, requestData, request, stopwatch.Elapsed, resp); if (requestData.ValidateResponse) { resp.ValidateResponse(); } return(resp); } catch (OperationCanceledException) when(!cancellationToken.IsCancellationRequested) { observer.OnTimeout(requestTag, requestData, request, stopwatch.Elapsed); throw new TimeoutException(); } catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested) { observer.OnCancelled(requestTag, requestData, request, stopwatch.Elapsed); throw new TaskCanceledException(); } catch (Exception e) { observer.OnFailed(requestTag, requestData, request, stopwatch.Elapsed, e); throw; } }