added requestLogger to IRouteHandler
This commit is contained in:
parent
af658b1656
commit
ee20c9c5ec
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -2,5 +2,5 @@
|
||||
|
||||
public interface IRouteHandler
|
||||
{
|
||||
public Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx);
|
||||
Task<HttpStatusCode> HandleRequest(HttpListenerContext ctx, ContextLogger requestLogger);
|
||||
}
|
||||
@ -2,5 +2,5 @@ namespace DTLib.Web.Routes;
|
||||
|
||||
public interface IRouter
|
||||
{
|
||||
Task<HttpStatusCode> Resolve(HttpListenerContext ctx);
|
||||
Task<HttpStatusCode> Resolve(HttpListenerContext ctx, ContextLogger requestLogger);
|
||||
}
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user