SimpleW

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

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

Source

using System.Net;
using SimpleW;

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

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


server.MapGet("/cookie", (HttpSession session) => ParseCookies(session));
server.MapPost("/cookie", (HttpSession session) => ParseCookies(session));
server.MapGet("/echo", (HttpSession session) =>
{
    var sb = new System.Text.StringBuilder();
    foreach (var h in session.Request.Headers.EnumerateAll())
        sb.AppendLine($"{h.Key}: {h.Value}");
    return sb.ToString();
});
server.MapPost("/echo", (HttpSession session) =>
{
    var sb = new System.Text.StringBuilder();
    foreach (var h in session.Request.Headers.EnumerateAll())
        sb.AppendLine($"{h.Key}: {h.Value}");
    return sb.ToString();
});
server.MapGet("/", () => "OK");
server.MapGet("/{path}", () => "OK");
server.MapPost("/", (HttpSession session) => session.Request.BodyString);
server.MapPost("/{path}", (HttpSession session) => session.Request.BodyString);

static string ParseCookies(HttpSession session)
{
    var sb = new System.Text.StringBuilder();
    foreach (var h in session.Request.Headers.EnumerateAll())
    {
        if (string.Equals(h.Key, "Cookie", StringComparison.OrdinalIgnoreCase))
        {
            foreach (var pair in h.Value.Split(';'))
            {
                var trimmed = pair.TrimStart();
                var eqIdx = trimmed.IndexOf('=');
                if (eqIdx > 0)
                    sb.AppendLine($"{trimmed[..eqIdx]}={trimmed[(eqIdx + 1)..]}");
            }
        }
    }
    return sb.ToString();
}

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

await server.RunAsync();

Test Results

Loading results...

Compliance

Smuggling

Malformed Input

Caching

Cookies