NetCoreServer

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/NetCoreServerFramework/ src/Servers/NetCoreServerFramework/
RUN dotnet restore src/Servers/NetCoreServerFramework/NetCoreServerFramework.csproj
RUN dotnet publish src/Servers/NetCoreServerFramework/NetCoreServerFramework.csproj -c Release -o /app --no-restore

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

Source

using System.Net;
using System.Net.Sockets;
using NetCoreServer;

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

var server = new OkHttpServer(IPAddress.Any, port);
server.Start();

Console.WriteLine($"NetCoreServer listening on http://localhost:{port}");

var waitHandle = new ManualResetEvent(false);
Console.CancelKeyPress += (_, e) => { e.Cancel = true; waitHandle.Set(); };
waitHandle.WaitOne();

server.Stop();

class OkHttpSession : HttpSession
{
    public OkHttpSession(NetCoreServer.HttpServer server) : base(server) { }

    protected override void OnReceivedRequest(HttpRequest request)
    {
        if (request.Url == "/echo")
        {
            var sb = new System.Text.StringBuilder();
            for (int i = 0; i < request.Headers; i++)
            {
                var (name, value) = request.Header(i);
                sb.AppendLine($"{name}: {value}");
            }
            SendResponseAsync(Response.MakeOkResponse(200).SetBody(sb.ToString()));
        }
        else if (request.Url == "/cookie")
        {
            var sb = new System.Text.StringBuilder();
            for (int i = 0; i < request.Headers; i++)
            {
                var (name, value) = request.Header(i);
                if (string.Equals(name, "Cookie", StringComparison.OrdinalIgnoreCase))
                {
                    foreach (var pair in value.Split(';'))
                    {
                        var trimmed = pair.TrimStart();
                        var eqIdx = trimmed.IndexOf('=');
                        if (eqIdx > 0)
                            sb.AppendLine($"{trimmed[..eqIdx]}={trimmed[(eqIdx + 1)..]}");
                    }
                }
            }
            SendResponseAsync(Response.MakeOkResponse(200).SetBody(sb.ToString()));
        }
        else if (request.Method == "POST" && request.Body.Length > 0)
            SendResponseAsync(Response.MakeOkResponse(200).SetBody(request.Body));
        else
            SendResponseAsync(Response.MakeOkResponse(200).SetBody("OK"));
    }

    protected override void OnReceivedRequestError(HttpRequest request, string error)
    {
        SendResponseAsync(Response.MakeErrorResponse(400));
    }

    protected override void OnError(SocketError error) { }
}

class OkHttpServer : NetCoreServer.HttpServer
{
    public OkHttpServer(IPAddress address, int port) : base(address, port) { }

    protected override TcpSession CreateSession() => new OkHttpSession(this);

    protected override void OnError(SocketError error) { }
}

Test Results

Loading results...

Compliance

Smuggling

Malformed Input

Caching

Cookies