added requestLogger to IRouteHandler

This commit is contained in:
Timerix 2025-04-06 14:59:27 +05:00
parent af658b1656
commit ee20c9c5ec
7 changed files with 21 additions and 19 deletions

View File

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<!--package info--> <!--package info-->
<PackageId>DTLib.Web</PackageId> <PackageId>DTLib.Web</PackageId>
<Version>1.2.2</Version> <Version>1.3.0</Version>
<Authors>Timerix</Authors> <Authors>Timerix</Authors>
<Description>HTTP Server with simple routing</Description> <Description>HTTP Server with simple routing</Description>
<RepositoryType>GIT</RepositoryType> <RepositoryType>GIT</RepositoryType>
@ -25,6 +25,6 @@
<ProjectReference Include="..\DTLib\DTLib.csproj" /> <ProjectReference Include="..\DTLib\DTLib.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup Condition=" '$(Configuration)' != 'Debug' "> <ItemGroup Condition=" '$(Configuration)' != 'Debug' ">
<PackageReference Include="DTLib" Version="1.6.5" /> <PackageReference Include="DTLib" Version="1.7.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -1,6 +1,9 @@
namespace DTLib.Web.Routes; namespace DTLib.Web.Routes;
public class DelegateRouteHandler(Func<HttpListenerContext, Task<HttpStatusCode>> routeHandler) : IRouteHandler public class DelegateRouteHandler(
Func<HttpListenerContext, ContextLogger, Task<HttpStatusCode>> routeHandler
) : IRouteHandler
{ {
public Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx) => routeHandler(ctx); public Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger)
=> routeHandler(ctx, requestLogger);
} }

View File

@ -2,5 +2,5 @@
public interface IRouteHandler public interface IRouteHandler
{ {
public Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx); Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger);
} }

View File

@ -2,5 +2,5 @@ namespace DTLib.Web.Routes;
public interface IRouter public interface IRouter
{ {
Task<HttpStatusCode> Resolve(HttpListenerContext ctx); Task<HttpStatusCode> Resolve(HttpListenerContext ctx, ContextLogger requestLogger);
} }

View File

@ -2,7 +2,7 @@
public class ServeFilesRouteHandler(IOPath _publicDir, string _homePageUrl = "index.html") : IRouteHandler public class ServeFilesRouteHandler(IOPath _publicDir, string _homePageUrl = "index.html") : IRouteHandler
{ {
public async Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx) public async Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger)
{ {
if (ctx.Request.HttpMethod != "GET") if (ctx.Request.HttpMethod != "GET")
return HttpStatusCode.BadRequest; return HttpStatusCode.BadRequest;

View File

@ -10,15 +10,16 @@ public class SimpleRouter : IRouter
public SimpleRouter(ILogger logger) 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, IRouteHandler route) => _routes.Add($"{url}:{method}", route);
public void MapRoute(string url, HttpMethod method, Func<HttpListenerContext, Task<HttpStatusCode>> route) public void MapRoute(string url, HttpMethod method,
Func<HttpListenerContext, ContextLogger, Task<HttpStatusCode>> route)
=> MapRoute(url, method, new DelegateRouteHandler(route)); => MapRoute(url, method, new DelegateRouteHandler(route));
public async Task<HttpStatusCode> Resolve(HttpListenerContext ctx) public async Task<HttpStatusCode> Resolve(HttpListenerContext ctx, ContextLogger requestLogger)
{ {
string? requestPath = ctx.Request.Url?.AbsolutePath; string? requestPath = ctx.Request.Url?.AbsolutePath;
@ -33,7 +34,7 @@ public class SimpleRouter : IRouter
_logger.LogWarn(nameof(SimpleRouter), $"couldn't resolve request path {requestPath}"); _logger.LogWarn(nameof(SimpleRouter), $"couldn't resolve request path {requestPath}");
status = HttpStatusCode.NotFound; status = HttpStatusCode.NotFound;
} }
else status = await route.HandleRequest(ctx); else status = await route.HandleRequest(ctx, requestLogger);
ctx.Response.StatusCode = (int)status; ctx.Response.StatusCode = (int)status;
await ctx.Response.OutputStream.FlushAsync(); await ctx.Response.OutputStream.FlushAsync();

View File

@ -41,7 +41,7 @@ public class WebApp
while (!_stopToken.IsCancellationRequested) while (!_stopToken.IsCancellationRequested)
{ {
var ctx = await server.GetContextAsync().AsCancellable(_stopToken); var ctx = await server.GetContextAsync().AsCancellable(_stopToken);
HandleRequestAsync(ctx, requestId++); HandleRequestAsync(ctx, new ContextLogger($"Request-{requestId++}", _logger));
} }
} }
catch (OperationCanceledException) catch (OperationCanceledException)
@ -51,22 +51,20 @@ public class WebApp
_logger.LogInfo("server stopped"); _logger.LogInfo("server stopped");
} }
// ReSharper disable once AsyncVoidMethod private async void HandleRequestAsync(HttpListenerContext ctx, ContextLogger requestLogger)
private async void HandleRequestAsync(HttpListenerContext ctx, long requestId)
{ {
string logContext = $"Request-{requestId}";
try 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(); var stopwatch = new Stopwatch();
stopwatch.Start(); stopwatch.Start();
var status = await _router.Resolve(ctx); var status = await _router.Resolve(ctx, requestLogger);
stopwatch.Stop(); 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) catch (Exception ex)
{ {
_logger.LogWarn(logContext, ex); requestLogger.LogWarn(ex);
} }
} }