using System.Net.Sockets; using MeWeb.Shared; namespace MeWeb.Server; public static class ServerApi { public static WebApplication MapMeWebApi(this WebApplication app) { app.MapGet(Endpoints.Server.GET_Info, Info); app.MapGet(Endpoints.Server.GET_Ip, Ip); app.MapGet(Endpoints.Downloads.GET_Page, Page); app.MapGet(Endpoints.Downloads.GET_Platform, Download); return app; } static ViewInfo Info() => new() { Version = BuildInfo.Version, Commit = BuildInfo.Commit, BuiltAt = BuildInfo.BuiltAt }; static IResult Ip(HttpContext context) { var address = context.Connection.RemoteIpAddress; if (address is null) return Results.BadRequest(); if (address.IsIPv4MappedToIPv6) address = address.MapToIPv4(); var family = address.AddressFamily == AddressFamily.InterNetworkV6 ? "ipv6" : "ipv4"; return Results.Ok(new ViewIp { Address = address.ToString(), Family = family }); } static async Task Page(HttpContext context, ReleaseFeed feed, CancellationToken ct) { var asked = context.Request.Query["lang"].ToString(); var language = asked is "it" or "en" ? asked : context.Request.Headers.AcceptLanguage.ToString().StartsWith("it", StringComparison.OrdinalIgnoreCase) ? "it" : "en"; var release = await feed.Latest(ct); context.Response.Headers.CacheControl = "no-cache"; context.Response.Headers.ContentLanguage = language; context.Response.Headers.Vary = "Accept-Language"; return Results.Content(DownloadPage.Render(release, language), "text/html; charset=utf-8"); } static async Task Download(string platform, ReleaseFeed feed, CancellationToken ct) { if (!ReleaseFeed.Platforms.Any(p => p.Platform == platform)) return Results.NotFound(); var asset = ReleaseFeed.Asset(await feed.Latest(ct), platform); return asset?.Url is null ? Results.Redirect(Endpoints.Gitea.Releases) : Results.Redirect(asset.Url); } }