async Task <InternalResponse> ExecuteInternal(RestRequest request, CancellationToken cancellationToken) { Ensure.NotNull(request, nameof(request)); using var requestContent = new RequestContent(this, request); if (Authenticator != null) { await Authenticator.Authenticate(this, request).ConfigureAwait(false); } var httpMethod = AsHttpMethod(request.Method); var url = BuildUri(request); var message = new HttpRequestMessage(httpMethod, url) { Content = requestContent.BuildContent() }; message.Headers.Host = Options.BaseHost; message.Headers.CacheControl = Options.CachePolicy; using var timeoutCts = new CancellationTokenSource(request.Timeout > 0 ? request.Timeout : int.MaxValue); using var cts = CancellationTokenSource.CreateLinkedTokenSource(timeoutCts.Token, cancellationToken); var ct = cts.Token; try { var headers = new RequestHeaders() .AddHeaders(request.Parameters) .AddHeaders(DefaultParameters) .AddAcceptHeader(AcceptedContentTypes); message.AddHeaders(headers); if (request.OnBeforeRequest != null) { await request.OnBeforeRequest(message).ConfigureAwait(false); } var responseMessage = await HttpClient.SendAsync(message, request.CompletionOption, ct).ConfigureAwait(false); if (request.OnAfterRequest != null) { await request.OnAfterRequest(responseMessage).ConfigureAwait(false); } return(new InternalResponse(responseMessage, url, null, timeoutCts.Token)); } catch (Exception ex) { return(new InternalResponse(null, url, ex, timeoutCts.Token)); } }