84 lines
2.9 KiB
C#
84 lines
2.9 KiB
C#
using System.Text;
|
|
|
|
namespace LowLevelGuyCom.Middleware;
|
|
|
|
public sealed class CurlLandingMiddleware(
|
|
RequestDelegate next)
|
|
{
|
|
public async Task Invoke(HttpContext context)
|
|
{
|
|
if (!HttpMethods.IsGet(context.Request.Method) || context.Request.Path != "/")
|
|
{
|
|
await next(context);
|
|
return;
|
|
}
|
|
|
|
if (WantsTerminalView(context.Request))
|
|
{
|
|
context.Response.StatusCode = StatusCodes.Status200OK;
|
|
context.Response.ContentType = "text/plain; charset=utf-8";
|
|
context.Response.Headers.CacheControl = "no-cache";
|
|
|
|
string ansi = BuildLowLevelGuyAnsi();
|
|
|
|
await context.Response.WriteAsync(ansi, Encoding.UTF8);
|
|
return;
|
|
}
|
|
|
|
await next(context);
|
|
}
|
|
|
|
private static bool WantsTerminalView(HttpRequest request)
|
|
{
|
|
string userAgent = request.Headers.UserAgent.ToString();
|
|
|
|
if (!string.IsNullOrWhiteSpace(userAgent))
|
|
{
|
|
string lowerUserAgent = userAgent.ToLowerInvariant();
|
|
if (lowerUserAgent.Contains("curl"))
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private static string BuildLowLevelGuyAnsi()
|
|
{
|
|
const string ESC = "\u001b";
|
|
string Arch(string s) => ESC + "[38;2;97;214;214m" + s + ESC + "[0m";
|
|
string Dim(string s) => ESC + "[38;2;140;140;140m" + s + ESC + "[0m";
|
|
string Bold(string s) => ESC + "[1m" + s + ESC + "[0m";
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
sb.AppendLine(Arch(" /\\"));
|
|
sb.AppendLine(Arch(" / \\") + " " + Bold("LOW LEVEL GUY"));
|
|
sb.AppendLine(Arch(" /\\ \\") + " " + Dim("arch vibes • low-level content"));
|
|
sb.AppendLine(Arch(" / \\"));
|
|
sb.AppendLine(Arch(" / ,, \\") + " C • ASM • Linux");
|
|
sb.AppendLine(Arch(" / | | -\\") + " no magic • just bytes");
|
|
sb.AppendLine(Arch(" /_-'' ''-_\\" ));
|
|
sb.AppendLine();
|
|
sb.AppendLine(Dim("────────────────────────────────────────────────────────"));
|
|
sb.AppendLine();
|
|
sb.AppendLine("$ curl " + Arch("low-level-guy.com"));
|
|
sb.AppendLine("$ web " + Arch("https://low-level-guy.com"));
|
|
sb.AppendLine();
|
|
sb.AppendLine("• systems programming");
|
|
sb.AppendLine("• graphics from scratch");
|
|
sb.AppendLine("• compilers, loaders, kernels");
|
|
sb.AppendLine();
|
|
sb.AppendLine(Dim("// operating below the abstraction layer"));
|
|
sb.AppendLine();
|
|
|
|
return sb.ToString();
|
|
}
|
|
}
|
|
|
|
public static class CurlLandingMiddlewareExtensions
|
|
{
|
|
public static IApplicationBuilder UseCurlLanding(this IApplicationBuilder app)
|
|
{
|
|
return app.UseMiddleware<CurlLandingMiddleware>();
|
|
}
|
|
} |