Browse Source

Refactor correctly handle empty response with ignore error flag is true (#1248)

* Refactor correctly handle empty response with ignore error flag is true

* Fix Incorrect string variable type in script test
pull/1250/head
Noah 1 year ago
committed by GitHub
parent
commit
55f971d8e4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs
  2. 60
      backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs

12
backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/Extensions/HttpJintExtension.cs

@ -78,10 +78,10 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ
JsValue responseObject; 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<string, object?> responseObject = JsValue.FromObject(context.Engine, new Dictionary<string, object?>
{ {
["statusCode"] = (int)response.StatusCode, ["statusCode"] = (int)response.StatusCode,
@ -96,7 +96,7 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ
} }
else else
{ {
responseObject = await ParseResponseAsync(context, response, ct); responseObject = ParseResponse(context, responseString, ct);
} }
scheduler.Run(callback, responseObject); scheduler.Run(callback, responseObject);
@ -156,11 +156,9 @@ public sealed class HttpJintExtension(IHttpClientFactory httpClientFactory) : IJ
return request; return request;
} }
private static async Task<JsValue> ParseResponseAsync(ScriptExecutionContext context, HttpResponseMessage response, private static JsValue ParseResponse(ScriptExecutionContext context, string responseString,
CancellationToken ct) CancellationToken ct)
{ {
var responseString = await response.Content.ReadAsStringAsync(ct);
ct.ThrowIfCancellationRequested(); ct.ThrowIfCancellationRequested();
var jsonParser = new JsonParser(context.Engine); var jsonParser = new JsonParser(context.Engine);

60
backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/Scripting/JintScriptEngineHelperTests.cs

@ -805,11 +805,67 @@ public class JintScriptEngineHelperTests : IClassFixture<TranslationsFixture>
await Assert.ThrowsAsync<ValidationException>(() => sut.ExecuteAsync(vars, script)); await Assert.ThrowsAsync<ValidationException>(() => 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<string, HttpMethod>()
{
{ "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) 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); var httpHandler = new MockupHttpHandler(httpResponse);

Loading…
Cancel
Save