DTLib/DTLib.Web/Routes/SimpleRouter.cs
2025-03-23 02:36:47 +05:00

46 lines
1.6 KiB
C#

namespace DTLib.Web.Routes;
public class SimpleRouter : IRouter
{
/// route for base url
public RouteHandler? HomePageRoute { get; set; }
/// route for any url that doesn't have its own handler
public RouteHandler? DefaultRoute { get; set; }
private readonly Dictionary<string, RouteHandler> _routes = new();
private readonly ILogger _logger;
public SimpleRouter(ILogger logger)
{
_logger = logger;
}
public void MapRoute(string url, HttpMethod method, RouteHandler route) => _routes.Add($"{url}:{method}", route);
public void MapRoute(string url, HttpMethod method, Func<HttpListenerContext, Task<HttpStatusCode>> route)
=> MapRoute(url, method, new DelegateRouteHandler(route));
public async Task<HttpStatusCode> Resolve(HttpListenerContext ctx)
{
string requestPath = ctx.Request.Url?.AbsolutePath ?? "/";
RouteHandler? route;
if(HomePageRoute != null && requestPath == "/")
route = HomePageRoute;
else if (!_routes.TryGetValue($"{requestPath}:{ctx.Request.HttpMethod}", out route))
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;
}
}