2022-03-09 23:19:00 +00:00
|
|
|
using Microsoft.AspNetCore.Http;
|
2023-10-03 08:25:57 +00:00
|
|
|
using Elsa.Http.Exceptions;
|
2022-03-09 23:19:00 +00:00
|
|
|
|
2022-05-26 10:47:31 +00:00
|
|
|
namespace Elsa.Http.Handlers;
|
2022-03-09 23:19:00 +00:00
|
|
|
|
2023-01-03 18:15:05 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// A default fault handler that writes information about the fault to the <see cref="HttpResponse"/>.
|
|
|
|
|
/// </summary>
|
2023-09-22 16:45:18 +00:00
|
|
|
public sealed class DefaultHttpEndpointFaultHandler : IHttpEndpointFaultHandler
|
2022-03-09 23:19:00 +00:00
|
|
|
{
|
2023-01-03 18:15:05 +00:00
|
|
|
/// <inheritdoc />
|
2023-09-22 16:45:18 +00:00
|
|
|
public ValueTask HandleAsync(HttpEndpointFaultContext context)
|
2022-03-09 23:19:00 +00:00
|
|
|
{
|
|
|
|
|
var httpContext = context.HttpContext;
|
2023-09-19 20:42:53 +00:00
|
|
|
var isTimeoutIncident = GetIsTimeoutFault(context);
|
2023-10-03 08:25:57 +00:00
|
|
|
var isBadRequest = GetIsBadRequestFault(context);
|
|
|
|
|
var statusCode = isTimeoutIncident
|
|
|
|
|
? StatusCodes.Status408RequestTimeout
|
|
|
|
|
: isBadRequest
|
|
|
|
|
? StatusCodes.Status400BadRequest
|
|
|
|
|
: StatusCodes.Status500InternalServerError;
|
|
|
|
|
|
2023-09-19 20:42:53 +00:00
|
|
|
httpContext.Response.StatusCode = statusCode;
|
2023-09-22 16:45:18 +00:00
|
|
|
return ValueTask.CompletedTask;
|
2022-03-09 23:19:00 +00:00
|
|
|
}
|
2023-09-19 20:42:53 +00:00
|
|
|
|
|
|
|
|
private bool GetIsTimeoutFault(HttpEndpointFaultContext context)
|
2023-10-03 08:25:57 +00:00
|
|
|
{
|
|
|
|
|
return ContainsException(context, typeof(OperationCanceledException), typeof(TaskCanceledException), typeof(TimeoutException));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool GetIsBadRequestFault(HttpEndpointFaultContext context)
|
|
|
|
|
{
|
|
|
|
|
return ContainsException(context, typeof(HttpBadRequestException));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private bool ContainsException(HttpEndpointFaultContext context, params Type[] exceptionTypes)
|
2023-09-19 20:42:53 +00:00
|
|
|
{
|
|
|
|
|
var workflowState = context.WorkflowState;
|
|
|
|
|
var timeoutIncident = workflowState.Incidents.FirstOrDefault(x => exceptionTypes.Contains(x.Exception?.Type));
|
|
|
|
|
|
|
|
|
|
return timeoutIncident != null;
|
|
|
|
|
}
|
2022-03-09 23:19:00 +00:00
|
|
|
}
|