using System.Reflection; using System.Runtime.CompilerServices; using Elsa.Extensions; using Elsa.Workflows.Core; using Elsa.Workflows.Core.Attributes; using Elsa.Workflows.Core.Models; using Elsa.Workflows.Core.Options; namespace Elsa.Http; /// /// Send an HTTP request. /// [Activity("Elsa", "HTTP", "Send an HTTP request.", DisplayName = "HTTP Request (flow)", Kind = ActivityKind.Task)] public class FlowSendHttpRequest : SendHttpRequestBase { /// public FlowSendHttpRequest([CallerFilePath] string? source = default, [CallerLineNumber] int? line = default) : base(source, line) { } /// /// A list of expected status codes to handle. /// [Input(Description = "A list of expected status codes to handle.", UIHint = InputUIHints.DynamicOutcomes, OptionsMethod = nameof(GetExpectedStatusCodesOptionsAsync))] public Input> ExpectedStatusCodes { get; set; } = default!; /// protected override async ValueTask HandleResponseAsync(ActivityExecutionContext context, HttpResponseMessage response) { var expectedStatusCodes = ExpectedStatusCodes.GetOrDefault(context) ?? new List(0); var statusCode = (int)response.StatusCode; var hasMatchingStatusCode = expectedStatusCodes.Contains(statusCode); var outcome = expectedStatusCodes.Any() ? hasMatchingStatusCode ? statusCode.ToString() : "Unmatched status code" : "Done"; await context.CompleteActivityWithOutcomesAsync(outcome); } /// protected override async ValueTask HandleRequestExceptionAsync(ActivityExecutionContext context, HttpRequestException exception) { await context.CompleteActivityWithOutcomesAsync("Failed to connect"); } /// protected override async ValueTask HandleTaskCanceledExceptionAsync(ActivityExecutionContext context, TaskCanceledException exception) { await context.CompleteActivityWithOutcomesAsync("Timeout"); } private static ValueTask> GetExpectedStatusCodesOptionsAsync(PropertyInfo property, CancellationToken cancellationToken = default) { var options = new Dictionary { [nameof(DynamicOutcomesOptions)] = new DynamicOutcomesOptions(new[]{"Unmatched status code", "Failed to connect", "Timeout", "Done"}) }; return new(options); } }