diff --git a/MTSC/Common/Http/Telemetry/IHttpLogger.cs b/MTSC/Common/Http/Telemetry/IHttpLogger.cs new file mode 100644 index 0000000..5781e07 --- /dev/null +++ b/MTSC/Common/Http/Telemetry/IHttpLogger.cs @@ -0,0 +1,11 @@ +using MTSC.ServerSide; +using MTSC.ServerSide.Handlers; + +namespace MTSC.Common.Http.Telemetry +{ + public interface IHttpLogger + { + void LogRequest(Server server, IHandler handler, ClientData client, HttpRequest request); + void LogResponse(Server server, IHandler handler, ClientData client, HttpResponse response); + } +} diff --git a/MTSC/MTSC.csproj b/MTSC/MTSC.csproj index 06da771..15968b8 100644 --- a/MTSC/MTSC.csproj +++ b/MTSC/MTSC.csproj @@ -5,12 +5,12 @@ netcoreapp2.1;net48;netstandard2.0;netcoreapp3.0;netcoreapp3.1 - 2.7.8 + 2.7.9 Alexandru-Victor Macocian MTSC Modular TCP Server and Client - 0.2.7.8 - 0.2.7.8 + 0.2.7.9 + 0.2.7.9 true AnyCPU;x64 https://github.com/AlexMacocian/MTSC diff --git a/MTSC/ServerSide/Handlers/HttpHandler.cs b/MTSC/ServerSide/Handlers/HttpHandler.cs index 2958f03..c87b098 100644 --- a/MTSC/ServerSide/Handlers/HttpHandler.cs +++ b/MTSC/ServerSide/Handlers/HttpHandler.cs @@ -1,5 +1,6 @@ using MTSC.Common.Http; using MTSC.Common.Http.ServerModules; +using MTSC.Common.Http.Telemetry; using MTSC.Exceptions; using System; using System.Collections.Concurrent; @@ -16,8 +17,9 @@ namespace MTSC.ServerSide.Handlers private static readonly string urlEncodedHeader = "application/x-www-form-urlencoded"; private static readonly string multipartHeader = "multipart/form-data"; #region Fields - List httpModules = new List(); - ConcurrentQueue> messageOutQueue = new ConcurrentQueue>(); + private List httpLoggers = new List(); + private List httpModules = new List(); + private ConcurrentQueue> messageOutQueue = new ConcurrentQueue>(); #endregion #region Public Properties public TimeSpan FragmentsExpirationTime { get; set; } = TimeSpan.FromSeconds(15); @@ -30,6 +32,11 @@ namespace MTSC.ServerSide.Handlers } #endregion #region Public Methods + public HttpHandler AddHttpLogger(IHttpLogger httpLogger) + { + this.httpLoggers.Add(httpLogger); + return this; + } public HttpHandler WithMaximumSize(double size) { this.MaximumRequestSize = size; @@ -184,6 +191,7 @@ namespace MTSC.ServerSide.Handlers { response.Headers[HttpMessage.GeneralHeaders.Connection] = "keep-alive"; } + foreach (var httpLogger in this.httpLoggers) httpLogger.LogRequest(server, this, client, request); foreach (IHttpModule module in httpModules) { if (module.HandleRequest(server, this, client, request, ref response)) @@ -191,6 +199,7 @@ namespace MTSC.ServerSide.Handlers break; } } + foreach (var httpLogger in this.httpLoggers) httpLogger.LogResponse(server, this, client, response); QueueResponse(client, response); return true; } diff --git a/MTSC/ServerSide/Handlers/HttpRoutingHandler.cs b/MTSC/ServerSide/Handlers/HttpRoutingHandler.cs index 7fff286..3f4c488 100644 --- a/MTSC/ServerSide/Handlers/HttpRoutingHandler.cs +++ b/MTSC/ServerSide/Handlers/HttpRoutingHandler.cs @@ -1,5 +1,6 @@ using MTSC.Common.Http; using MTSC.Common.Http.RoutingModules; +using MTSC.Common.Http.Telemetry; using MTSC.Exceptions; using System; using System.Collections.Concurrent; @@ -15,6 +16,8 @@ namespace MTSC.ServerSide.Handlers private ConcurrentQueue> messageOutQueue = new ConcurrentQueue>(); + private List httpLoggers = new List(); + private Dictionary)>> moduleDictionary = new Dictionary routeEnabler) { + foreach (var httpLogger in this.httpLoggers) httpLogger.LogRequest(server, this, client, request); + var routeEnablerResponse = routeEnabler.Invoke(server, request, client); if (routeEnablerResponse is RouteEnablerResponse.RouteEnablerResponseAccept) { @@ -231,7 +240,9 @@ namespace MTSC.ServerSide.Handlers { server.LogDebug("Exception: " + e.Message); server.LogDebug("Stacktrace: " + e.StackTrace); - QueueResponse(client, new HttpResponse() { StatusCode = StatusCodes.InternalServerError }); + var response = new HttpResponse() { StatusCode = StatusCodes.InternalServerError }; + foreach (var httpLogger in this.httpLoggers) httpLogger.LogResponse(server, this, client, response); + QueueResponse(client, response); } return true; } @@ -241,6 +252,8 @@ namespace MTSC.ServerSide.Handlers } else if (routeEnablerResponse is RouteEnablerResponse.RouteEnablerResponseError) { + foreach (var httpLogger in this.httpLoggers) + httpLogger.LogResponse(server, this, client, (routeEnablerResponse as RouteEnablerResponse.RouteEnablerResponseError).Response); QueueResponse(client, (routeEnablerResponse as RouteEnablerResponse.RouteEnablerResponseError).Response); return true; } diff --git a/MTSC/ServerSide/Handlers/IHandler.cs b/MTSC/ServerSide/Handlers/IHandler.cs index 79e27d4..9549cf9 100644 --- a/MTSC/ServerSide/Handlers/IHandler.cs +++ b/MTSC/ServerSide/Handlers/IHandler.cs @@ -1,7 +1,4 @@ using System; -using System.Collections.Generic; -using System.Net.Sockets; -using System.Text; namespace MTSC.ServerSide.Handlers { diff --git a/MTSC/ServerSide/Server.cs b/MTSC/ServerSide/Server.cs index ebe22f7..17d6964 100644 --- a/MTSC/ServerSide/Server.cs +++ b/MTSC/ServerSide/Server.cs @@ -6,9 +6,7 @@ using MTSC.ServerSide.Resources; using MTSC.ServerSide.Schedulers; using MTSC.ServerSide.UsageMonitors; using System; -using System.Collections.Concurrent; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Net; using System.Net.Security; @@ -457,6 +455,7 @@ namespace MTSC.ServerSide Scheduler.ScheduleHandling( clients + .Where(client => client.ToBeRemoved == false) .Select(client => (client, (client as IQueueHolder).ConsumerQueue)) .ToList(), HandleClientMessages);