示例#1
0
    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));
        }
    }