Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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;
            }
        }