46 lines
1.6 KiB
C#
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;
|
|
}
|
|
} |