diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs index 8d992ce2e..b000d0ae8 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs @@ -78,10 +78,10 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ JsValue responseObject; - if (ignoreError && !response.IsSuccessStatusCode) - { - var responseString = await response.Content.ReadAsStringAsync(ct); + var responseString = await response.Content.ReadAsStringAsync(ct); + if (ignoreError && (!response.IsSuccessStatusCode || string.IsNullOrEmpty(responseString))) + { responseObject = JsValue.FromObject(context.Engine, new Dictionary { ["statusCode"] = (int)response.StatusCode, @@ -96,7 +96,7 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ } else { - responseObject = await ParseResponseAsync(context, response, ct); + responseObject = ParseResponse(context, responseString, ct); } scheduler.Run(callback, responseObject); @@ -156,11 +156,9 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ return request; } - private static async Task ParseResponseAsync(ScriptExecutionContext context, HttpResponseMessage response, + private static JsValue ParseResponse(ScriptExecutionContext context, string responseString, CancellationToken ct) { - var responseString = await response.Content.ReadAsStringAsync(ct); - ct.ThrowIfCancellationRequested(); var jsonParser = new JsonParser(context.Engine); diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs index 6575fbcae..4040cda47 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs @@ -805,11 +805,67 @@ public class JintScriptEngineHelperTests : IClassFixture await Assert.ThrowsAsync(() => sut.ExecuteAsync(vars, script)); } - private MockupHttpHandler SetupRequest(HttpStatusCode statusCode = HttpStatusCode.OK) + [Theory] + [InlineData("patchJSON")] + [InlineData("postJSON")] + [InlineData("putJSON")] + [InlineData("deleteJSON")] + [InlineData("getJSON")] + public async Task Should_handle_successful_response_with_empty_body_when_error_ignore_flag_is_true(string input) + { + var httpHandler = SetupRequest(HttpStatusCode.NoContent, new StringContent(string.Empty, Encoding.UTF8, "text/plain")); + + var vars = new ScriptVars + { + }; + + var script = $@" + var url = 'http://squidex.io/'; + var hasRequestBodyMethods = ['patchJSON', 'postJSON', 'putJSON'] + + if (hasRequestBodyMethods.indexOf('{input}') != -1) {{ + {input}(url, {{}}, function(actual) {{ + complete(actual); + }}, undefined, true); + }} + else {{ + {input}(url, function(actual) {{ + complete(actual); + }}, undefined, true); + }} + "; + + var actual = await sut.ExecuteAsync(vars, script); + + var methodMap = new Dictionary() + { + { "patchJSON", HttpMethod.Patch }, + { "postJSON", HttpMethod.Post }, + { "putJSON", HttpMethod.Put }, + { "deleteJSON", HttpMethod.Delete }, + { "getJSON", HttpMethod.Get }, + }; + + httpHandler.ShouldBeUrl("http://squidex.io/"); + httpHandler.ShouldBeMethod(methodMap[input]); + + var expectedResult = + JsonValue.Object() + .Add("statusCode", 204) + .Add("headers", + JsonValue.Object() + .Add("Content-Type", "text/plain; charset=utf-8") + .Add("Content-Length", "0")) + .Add("body", string.Empty); + + Assert.Equal(expectedResult, actual); + } + + private MockupHttpHandler SetupRequest(HttpStatusCode statusCode = HttpStatusCode.OK, StringContent? responseContent = null) { var httpResponse = new HttpResponseMessage(statusCode) { - Content = new StringContent("{ \"key\": 42 }", Encoding.UTF8, "application/json"), + Content = responseContent ?? new StringContent("{ \"key\": 42 }", Encoding.UTF8, "application/json"), }; var httpHandler = new MockupHttpHandler(httpResponse);