in src/WebJobs.Extensions.DurableTask/HttpApiHandler.cs [601:695]
private async Task<HttpResponseMessage> HandleGetStatusRequestAsync(
HttpRequestMessage request,
string instanceId,
bool? returnInternalServerErrorOnFailure = null,
IDurableOrchestrationClient existingClient = null)
{
IDurableOrchestrationClient client = existingClient ?? this.GetClient(request);
var queryNameValuePairs = request.GetQueryNameValuePairs();
if (!TryGetBooleanQueryParameterValue(queryNameValuePairs, ShowHistoryParameter, out bool showHistory))
{
showHistory = false;
}
if (!TryGetBooleanQueryParameterValue(queryNameValuePairs, ShowHistoryOutputParameter, out bool showHistoryOutput))
{
showHistoryOutput = false;
}
if (!TryGetBooleanQueryParameterValue(queryNameValuePairs, ShowInputParameter, out bool showInput))
{
showInput = true;
}
bool finalReturnInternalServerErrorOnFailure;
if (returnInternalServerErrorOnFailure.HasValue)
{
finalReturnInternalServerErrorOnFailure = returnInternalServerErrorOnFailure.Value;
}
else
{
if (!TryGetBooleanQueryParameterValue(queryNameValuePairs, ReturnInternalServerErrorOnFailure, out finalReturnInternalServerErrorOnFailure))
{
finalReturnInternalServerErrorOnFailure = false;
}
}
var status = await client.GetStatusAsync(instanceId, showHistory, showHistoryOutput, showInput);
if (status == null)
{
return request.CreateResponse(HttpStatusCode.NotFound);
}
HttpStatusCode statusCode;
Uri location;
switch (status.RuntimeStatus)
{
// The orchestration is running - return 202 w/Location header
case OrchestrationRuntimeStatus.Running:
case OrchestrationRuntimeStatus.Pending:
case OrchestrationRuntimeStatus.ContinuedAsNew:
case OrchestrationRuntimeStatus.Suspended:
statusCode = HttpStatusCode.Accepted;
location = request.RequestUri;
break;
// The orchestration has failed - return 500 w/out Location header
case OrchestrationRuntimeStatus.Failed:
statusCode = finalReturnInternalServerErrorOnFailure ? HttpStatusCode.InternalServerError : HttpStatusCode.OK;
location = null;
break;
// The orchestration is not running - return 200 w/out Location header
case OrchestrationRuntimeStatus.Canceled:
case OrchestrationRuntimeStatus.Terminated:
case OrchestrationRuntimeStatus.Completed:
statusCode = HttpStatusCode.OK;
location = null;
break;
default:
this.logger.LogError($"Unknown runtime state '{status.RuntimeStatus}'.");
statusCode = HttpStatusCode.InternalServerError;
location = null;
break;
}
var response =
request.CreateResponse(
statusCode,
ConvertFrom(status));
if (location != null)
{
response.Headers.Location = location;
}
if (statusCode == HttpStatusCode.Accepted)
{
// Ask for 5 seconds before retry. Some clients will otherwise retry in a tight loop.
response.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromSeconds(5));
}
return response;
}