Browse Source

Http request jint extension.

pull/1132/head
Sebastian Stehle 2 years ago
parent
commit
32007539d7
  1. 64
      backend/src/Squidex.Web/Scripting/HttpRequestJintExtension.cs
  2. 4
      backend/src/Squidex/Config/Domain/InfrastructureServices.cs
  3. 157
      backend/tests/Squidex.Web.Tests/Scripting/HttpRequestJintExtensionTests.cs

64
backend/src/Squidex.Web/Scripting/HttpRequestJintExtension.cs

@ -0,0 +1,64 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Jint;
using Microsoft.AspNetCore.Http;
using Squidex.Domain.Apps.Core.Scripting;
namespace Squidex.Web.Scripting;
public sealed class HttpRequestJintExtension : IJintExtension, IScriptDescriptor
{
private delegate RequestInfo? GetRequestDelegate();
private readonly IHttpContextAccessor httpContextAccessor;
private sealed class RequestInfo
{
public string Method { get; set; }
public string Path { get; set; }
public string? QueryString { get; set; }
public Dictionary<string, string?[]> Query { get; set; }
}
public HttpRequestJintExtension(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}
public void Extend(Engine engine)
{
var getRequest = new GetRequestDelegate(() =>
{
var request = httpContextAccessor.HttpContext?.Request;
if (request == null)
{
return null;
}
var result = new RequestInfo
{
Method = request.Method,
Path = request.Path,
Query = request.Query.ToDictionary(x => x.Key, x => x.Value.ToArray()),
QueryString = request.QueryString.Value
};
return result;
});
engine.SetValue("getRequest", getRequest);
}
public void Describe(AddDescription describe, ScriptScope scope)
{
describe(JsonType.Function, "getRequest()",
"Gets information about the actual HTTP request.");
}
}

4
backend/src/Squidex/Config/Domain/InfrastructureServices.cs

@ -28,6 +28,7 @@ using Squidex.Pipeline.Robots;
using Squidex.Shared;
using Squidex.Web;
using Squidex.Web.Pipeline;
using Squidex.Web.Scripting;
namespace Squidex.Config.Domain;
@ -71,6 +72,9 @@ public static class InfrastructureServices
services.AddSingletonAs<CounterJintExtension>()
.As<IJintExtension>().As<IScriptDescriptor>();
services.AddSingletonAs<HttpRequestJintExtension>()
.As<IJintExtension>().As<IScriptDescriptor>();
services.AddSingletonAs<DateTimeJintExtension>()
.As<IJintExtension>().As<IScriptDescriptor>();

157
backend/tests/Squidex.Web.Tests/Scripting/HttpRequestJintExtensionTests.cs

@ -0,0 +1,157 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using Squidex.Domain.Apps.Core.Scripting;
namespace Squidex.Web.Scripting;
public class HttpRequestJintExtensionTests
{
private readonly IHttpContextAccessor httpContextAccessor = A.Fake<IHttpContextAccessor>();
private readonly JintScriptEngine sut;
public HttpRequestJintExtensionTests()
{
var extensions = new IJintExtension[]
{
new HttpRequestJintExtension(httpContextAccessor)
};
sut = new JintScriptEngine(new MemoryCache(Options.Create(new MemoryCacheOptions())),
Options.Create(new JintScriptOptions
{
TimeoutScript = TimeSpan.FromSeconds(2),
TimeoutExecution = TimeSpan.FromSeconds(10)
}), extensions);
}
[Fact]
public void Should_get_null_request()
{
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(null);
const string script = @"
getRequest();
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("null", actual);
}
[Fact]
public void Should_get_method()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.Method = "DELETE";
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().method;
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("DELETE", actual);
}
[Fact]
public void Should_get_path()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.Path = "/path/to/request";
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().path;
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("/path/to/request", actual);
}
[Fact]
public void Should_get_query_string()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.QueryString = new QueryString("?key=value");
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().queryString;
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("?key=value", actual);
}
[Fact]
public void Should_get_query_string_if_null()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.QueryString = default;
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().queryString;
";
var actual = sut.Execute([], script).ToString();
Assert.Equal(string.Empty, actual);
}
[Fact]
public void Should_get_query()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.QueryString = new QueryString("?a=1&a=2&b=3");
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().query;
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("{\"a\":[\"1\", \"2\"], \"b\":[\"3\"]}", actual);
}
[Fact]
public void Should_get_concrete_query()
{
var httpContext = new DefaultHttpContext();
httpContext.Request.QueryString = new QueryString("?a=1&a=2&b=3");
A.CallTo(() => httpContextAccessor.HttpContext)
.Returns(httpContext);
const string script = @"
getRequest().query.a[1];
";
var actual = sut.Execute([], script).ToString();
Assert.Equal("2", actual);
}
}
Loading…
Cancel
Save