Effinitive

Language: C# · View source on GitHub

Dockerfile

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY Directory.Build.props .
COPY src/Servers/EffinitiveServer/ src/Servers/EffinitiveServer/
RUN dotnet restore src/Servers/EffinitiveServer/EffinitiveServer.csproj
RUN dotnet publish src/Servers/EffinitiveServer/EffinitiveServer.csproj -c Release -o /app --no-restore

FROM mcr.microsoft.com/dotnet/runtime:10.0
WORKDIR /app
COPY --from=build /app .
USER $APP_UID
ENTRYPOINT ["dotnet", "EffinitiveServer.dll", "8080"]

Source — Program.cs

using System.Text;
using EffinitiveFramework.Core;
using EffinitiveFramework.Core.Http;

var port = args.Length > 0 && int.TryParse(args[0], out var p) ? p : 8080;

var app = EffinitiveApp
    .Create()
    .UsePort(port)
    .MapEndpoints()
    .Build();

Console.WriteLine($"Effinitive listening on http://localhost:{port}");
await app.RunAsync();

namespace EffinitiveServer.Endpoints
{
    // ── GET / ──────────────────────────────────────────────────────

    sealed class GetRoot : NoRequestEndpointBase<string>
    {
        protected override string Method => "GET";
        protected override string Route => "/";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
            => ValueTask.FromResult("OK");
    }

    // ── POST / ─────────────────────────────────────────────────────

    sealed class PostRoot : NoRequestEndpointBase<string>
    {
        protected override string Method => "POST";
        protected override string Route => "/";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
        {
            var body = HttpContext?.Body;
            return ValueTask.FromResult(body is { Length: > 0 } ? Encoding.UTF8.GetString(body) : "");
        }
    }

    // ── GET/POST /echo ────────────────────────────────────────────

    sealed class EchoGet : NoRequestEndpointBase<string>
    {
        protected override string Method => "GET";
        protected override string Route => "/echo";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
            => ValueTask.FromResult(Helpers.EchoHeaders(HttpContext));
    }

    sealed class EchoPost : NoRequestEndpointBase<string>
    {
        protected override string Method => "POST";
        protected override string Route => "/echo";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
            => ValueTask.FromResult(Helpers.EchoHeaders(HttpContext));
    }

    // ── GET/POST /cookie ──────────────────────────────────────────

    sealed class CookieGet : NoRequestEndpointBase<string>
    {
        protected override string Method => "GET";
        protected override string Route => "/cookie";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
            => ValueTask.FromResult(Helpers.ParseCookies(HttpContext));
    }

    sealed class CookiePost : NoRequestEndpointBase<string>
    {
        protected override string Method => "POST";
        protected override string Route => "/cookie";
        protected override string ContentType => Helpers.TextPlain;

        public override ValueTask<string> HandleAsync(CancellationToken ct = default)
            => ValueTask.FromResult(Helpers.ParseCookies(HttpContext));
    }

    // ── Shared helpers ────────────────────────────────────────────

    static class Helpers
    {
        public const string TextPlain = "text/plain";

        public static string EchoHeaders(HttpRequest? ctx)
        {
            if (ctx?.Headers is null) return "";
            var sb = new StringBuilder();
            foreach (var h in ctx.Headers)
                sb.Append(h.Key).Append(": ").Append(h.Value).Append("\r\n");
            return sb.ToString();
        }

        public static string ParseCookies(HttpRequest? ctx)
        {
            if (ctx is null) return "";
            var sb = new StringBuilder();
            foreach (var c in ctx.Cookies)
                sb.Append(c.Key).Append('=').Append(c.Value).Append("\r\n");
            return sb.ToString();
        }
    }
}

Test Results

Loading results...

Compliance

Smuggling

Malformed Input

Caching

Cookies