added requestLogger to IRouteHandler
This commit is contained in:
parent
af658b1656
commit
ee20c9c5ec
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
@ -2,5 +2,5 @@
|
|||||||
|
|
||||||
public interface IRouteHandler
|
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
|
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 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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user