using Elsa.Http.Models;
using Microsoft.AspNetCore.Http;
using System.Net.Mime;
using Elsa.Http.Contracts;
using Elsa.Workflows.Core.Contracts;
namespace Elsa.Http.Handlers;
///
/// A default fault handler that writes information about the fault to the .
///
public sealed class DefaultHttpEndpointFaultHandler : IHttpEndpointFaultHandler
{
///
public ValueTask HandleAsync(HttpEndpointFaultContext context)
{
var httpContext = context.HttpContext;
var isTimeoutIncident = GetIsTimeoutFault(context);
var statusCode = isTimeoutIncident ? StatusCodes.Status408RequestTimeout : StatusCodes.Status500InternalServerError;
httpContext.Response.StatusCode = statusCode;
return ValueTask.CompletedTask;
}
private bool GetIsTimeoutFault(HttpEndpointFaultContext context)
{
var workflowState = context.WorkflowState;
var exceptionTypes = new[] { typeof(OperationCanceledException), typeof(TaskCanceledException), typeof(TimeoutException) };
var timeoutIncident = workflowState.Incidents.FirstOrDefault(x => exceptionTypes.Contains(x.Exception?.Type));
return timeoutIncident != null;
}
}