diff --git a/DTLib.Web/DTLib.Web.csproj b/DTLib.Web/DTLib.Web.csproj index 15ad3ee..cffa3d1 100644 --- a/DTLib.Web/DTLib.Web.csproj +++ b/DTLib.Web/DTLib.Web.csproj @@ -2,7 +2,7 @@ DTLib.Web - 1.2.2 + 1.3.0 Timerix HTTP Server with simple routing GIT @@ -25,6 +25,6 @@ - + diff --git a/DTLib.Web/Routes/DelegateRouteHandler.cs b/DTLib.Web/Routes/DelegateRouteHandler.cs index a8e531a..3051287 100644 --- a/DTLib.Web/Routes/DelegateRouteHandler.cs +++ b/DTLib.Web/Routes/DelegateRouteHandler.cs @@ -1,6 +1,9 @@ namespace DTLib.Web.Routes; -public class DelegateRouteHandler(Func> routeHandler) : IRouteHandler +public class DelegateRouteHandler( + Func> routeHandler + ) : IRouteHandler { - public Task HandleRequest(HttpListenerContext ctx) => routeHandler(ctx); + public Task HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger) + => routeHandler(ctx, requestLogger); } \ No newline at end of file diff --git a/DTLib.Web/Routes/IRouteHandler.cs b/DTLib.Web/Routes/IRouteHandler.cs index 6a83d67..4c2c34e 100644 --- a/DTLib.Web/Routes/IRouteHandler.cs +++ b/DTLib.Web/Routes/IRouteHandler.cs @@ -2,5 +2,5 @@ public interface IRouteHandler { - public Task HandleRequest(HttpListenerContext ctx); + Task HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger); } \ No newline at end of file diff --git a/DTLib.Web/Routes/IRouter.cs b/DTLib.Web/Routes/IRouter.cs index 45f66fc..b3ae250 100644 --- a/DTLib.Web/Routes/IRouter.cs +++ b/DTLib.Web/Routes/IRouter.cs @@ -2,5 +2,5 @@ namespace DTLib.Web.Routes; public interface IRouter { - Task Resolve(HttpListenerContext ctx); + Task Resolve(HttpListenerContext ctx, ContextLogger requestLogger); } \ No newline at end of file diff --git a/DTLib.Web/Routes/ServeFilesRouteHandler.cs b/DTLib.Web/Routes/ServeFilesRouteHandler.cs index 5a63b50..deb97b2 100644 --- a/DTLib.Web/Routes/ServeFilesRouteHandler.cs +++ b/DTLib.Web/Routes/ServeFilesRouteHandler.cs @@ -2,7 +2,7 @@ public class ServeFilesRouteHandler(IOPath _publicDir, string _homePageUrl = "index.html") : IRouteHandler { - public async Task HandleRequest(HttpListenerContext ctx) + public async Task HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger) { if (ctx.Request.HttpMethod != "GET") return HttpStatusCode.BadRequest; diff --git a/DTLib.Web/Routes/SimpleRouter.cs b/DTLib.Web/Routes/SimpleRouter.cs index 05bba5a..838c45b 100644 --- a/DTLib.Web/Routes/SimpleRouter.cs +++ b/DTLib.Web/Routes/SimpleRouter.cs @@ -10,15 +10,16 @@ public class SimpleRouter : IRouter public SimpleRouter(ILogger logger) { - _logger = logger; + _logger = new ContextLogger(nameof(SimpleRouter), logger); } public void MapRoute(string url, HttpMethod method, IRouteHandler route) => _routes.Add($"{url}:{method}", route); - public void MapRoute(string url, HttpMethod method, Func> route) + public void MapRoute(string url, HttpMethod method, + Func> route) => MapRoute(url, method, new DelegateRouteHandler(route)); - public async Task Resolve(HttpListenerContext ctx) + public async Task Resolve(HttpListenerContext ctx, ContextLogger requestLogger) { string? requestPath = ctx.Request.Url?.AbsolutePath; @@ -33,7 +34,7 @@ public class SimpleRouter : IRouter _logger.LogWarn(nameof(SimpleRouter), $"couldn't resolve request path {requestPath}"); status = HttpStatusCode.NotFound; } - else status = await route.HandleRequest(ctx); + else status = await route.HandleRequest(ctx, requestLogger); ctx.Response.StatusCode = (int)status; await ctx.Response.OutputStream.FlushAsync(); diff --git a/DTLib.Web/WebApp.cs b/DTLib.Web/WebApp.cs index 0f7c423..37fca5d 100644 --- a/DTLib.Web/WebApp.cs +++ b/DTLib.Web/WebApp.cs @@ -41,7 +41,7 @@ public class WebApp while (!_stopToken.IsCancellationRequested) { var ctx = await server.GetContextAsync().AsCancellable(_stopToken); - HandleRequestAsync(ctx, requestId++); + HandleRequestAsync(ctx, new ContextLogger($"Request-{requestId++}", _logger)); } } catch (OperationCanceledException) @@ -51,22 +51,20 @@ public class WebApp _logger.LogInfo("server stopped"); } - // ReSharper disable once AsyncVoidMethod - private async void HandleRequestAsync(HttpListenerContext ctx, long requestId) + private async void HandleRequestAsync(HttpListenerContext ctx, ContextLogger requestLogger) { - string logContext = $"Request-{requestId}"; try { - _logger.LogInfo(logContext, $"[{ctx.Request.HttpMethod}] {ctx.Request.RawUrl} from {ctx.Request.RemoteEndPoint}..."); + requestLogger.LogInfo($"{ctx.Request.HttpMethod} {ctx.Request.RawUrl} from {ctx.Request.RemoteEndPoint}..."); var stopwatch = new Stopwatch(); stopwatch.Start(); - var status = await _router.Resolve(ctx); + var status = await _router.Resolve(ctx, requestLogger); stopwatch.Stop(); - _logger.LogInfo(logContext, $"responded {(int)status} ({status}) in {stopwatch.ElapsedMilliseconds}ms"); + requestLogger.LogInfo($"responded {(int)status} ({status}) in {stopwatch.ElapsedMilliseconds}ms"); } catch (Exception ex) { - _logger.LogWarn(logContext, ex); + requestLogger.LogWarn(ex); } }