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

View File

@ -1,6 +1,9 @@
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 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
{
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 async Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx)
public async Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger)
{
if (ctx.Request.HttpMethod != "GET")
return HttpStatusCode.BadRequest;

View File

@ -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<HttpListenerContext, Task<HttpStatusCode>> route)
public void MapRoute(string url, HttpMethod method,
Func<HttpListenerContext, ContextLogger, Task<HttpStatusCode>> 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;
@ -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();

View File

@ -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);
}
}