protected internal override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancel) { if (request == null) { throw new ArgumentNullException(nameof(request)); } cancel.ThrowIfCancellationRequested(); Guid loggingRequestId = s_diagnosticListener.LogHttpRequest(request); RTHttpRequestMessage rtRequest = await ConvertRequestAsync(request).ConfigureAwait(false); RTHttpResponseMessage rtResponse = await _next.SendRequestAsync(rtRequest).AsTask(cancel).ConfigureAwait(false); // Update in case of redirects request.RequestUri = rtRequest.RequestUri; HttpResponseMessage response = ConvertResponse(rtResponse); response.RequestMessage = request; s_diagnosticListener.LogHttpResponse(response, loggingRequestId); return(response); }
protected internal override Task <HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(nameof(request), SR.net_http_handler_norequest); } if (request.RequestUri.Scheme == UriSchemeHttps) { if (!s_supportsSSL) { throw new PlatformNotSupportedException(SR.net_http_unix_https_support_unavailable_libcurl); } } else { Debug.Assert(request.RequestUri.Scheme == UriSchemeHttp, "HttpClient expected to validate scheme as http or https."); } if (request.Headers.TransferEncodingChunked.GetValueOrDefault() && (request.Content == null)) { throw new InvalidOperationException(SR.net_http_chunked_not_allowed_with_empty_content); } if (_useCookie && _cookieContainer == null) { throw new InvalidOperationException(SR.net_http_invalid_cookiecontainer); } Guid loggingRequestId = s_diagnosticListener.LogHttpRequest(request); CheckDisposed(); SetOperationStarted(); // Do an initial cancellation check to avoid initiating the async operation if // cancellation has already been requested. After this, we'll rely on CancellationToken.Register // to notify us of cancellation requests and shut down the operation if possible. if (cancellationToken.IsCancellationRequested) { return(Task.FromCanceled <HttpResponseMessage>(cancellationToken)); } EventSourceTrace("{0}", request); // Create the easy request. This associates the easy request with this handler and configures // it based on the settings configured for the handler. var easy = new EasyRequest(this, request, cancellationToken); try { easy.InitializeCurl(); if (easy._requestContentStream != null) { easy._requestContentStream.Run(); } _agent.Queue(new MultiAgent.IncomingRequest { Easy = easy, Type = MultiAgent.IncomingRequestType.New }); } catch (Exception exc) { easy.FailRequest(exc); easy.Cleanup(); // no active processing remains, so we can cleanup } s_diagnosticListener.LogHttpResponse(easy.Task, loggingRequestId); return(easy.Task); }