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);
}
}