public async override Task RunAsync()

in src/WebJobs.Extensions.DurableTask/Listener/TaskHttpActivityShim.cs [39:96]


        public async override Task<string> RunAsync(TaskContext context, string rawInput)
        {
            DurableHttpRequest durableHttpRequest = ReconstructDurableHttpRequest(rawInput);
            HttpRequestMessage requestMessage = await this.ConvertToHttpRequestMessage(durableHttpRequest);

            HttpResponseMessage response;
            try
            {
                if (durableHttpRequest.Timeout == null)
                {
                    response = await this.httpClient.SendAsync(requestMessage);
                }
                else
                {
                    try
                    {
                        using (CancellationTokenSource cts = new CancellationTokenSource())
                        {
                            cts.CancelAfter(durableHttpRequest.Timeout.Value);
                            response = await this.httpClient.SendAsync(requestMessage, cts.Token);
                        }
                    }
                    catch (OperationCanceledException ex)
                    {
                        TimeoutException e = new TimeoutException(ex.Message + $" Reached user specified timeout: {durableHttpRequest.Timeout.Value}.");

                        string details = Utils.SerializeCause(e, this.config.ErrorDataConverter);
                        throw new TaskFailureException(e.Message, e, details);
                    }
                }

                if (durableHttpRequest.HttpRetryOptions != null)
                {
                    // Based on what status codes are configured to retry, we throw an exception
                    // to fail the activity so that the DTFx retry options are respected.
                    if (durableHttpRequest.HttpRetryOptions.StatusCodesToRetry == null
                        || durableHttpRequest.HttpRetryOptions.StatusCodesToRetry.Count == 0)
                    {
                        // If HttpRetryOptions are provided, but no specific status codes are specified,
                        // we will throw an exception on any 4xx or 5xx error to trigger retries.
                        response.EnsureSuccessStatusCode();
                    }
                    else if (durableHttpRequest.HttpRetryOptions.StatusCodesToRetry.Contains(response.StatusCode) == true)
                    {
                        throw new HttpRequestException($"Status code {response.StatusCode} received, retry requested.");
                    }
                }

                DurableHttpResponse durableHttpResponse = await DurableHttpResponse.CreateDurableHttpResponseWithHttpResponseMessage(response);

                return JsonConvert.SerializeObject(durableHttpResponse);
            }
            catch (HttpRequestException ex)
            {
                string details = Utils.SerializeCause(ex, this.config.ErrorDataConverter);
                throw new TaskFailureException(ex.Message, ex, details);
            }
        }