namespace DTLib.Web.Routes; public class SimpleRouter : IRouter { /// route for base url public RouteHandler? HomePageRoute = null; /// route for any url that doesn't have its own handler public RouteHandler? DefaultRoute = null; private readonly Dictionary _routes = new(); private readonly ILogger _logger; public SimpleRouter(ILogger logger) { _logger = logger; } public void MapRoute(string url, Func> route) => MapRoute(url, new DelegateRouteHandler(route)); public void MapRoute(string url, RouteHandler route) => _routes.Add(url, route); public async Task Resolve(HttpListenerContext ctx) { string requestPath = ctx.Request.Url?.AbsolutePath ?? "/"; RouteHandler? route; if(HomePageRoute != null && requestPath == "/") route = HomePageRoute; else if (_routes.TryGetValue(requestPath, out var routeDelegate)) route = routeDelegate; else route = DefaultRoute; HttpStatusCode status; if (route == null) { _logger.LogWarn(nameof(SimpleRouter), $"couldn't resolve request path {requestPath}"); status = HttpStatusCode.NotFound; } else status = await route.HandleRequest(ctx); ctx.Response.StatusCode = (int)status; await ctx.Response.OutputStream.FlushAsync(); ctx.Response.OutputStream.Close(); return status; } }