From aa63e598f2dae2a332fe7df565ac0562218a72ea Mon Sep 17 00:00:00 2001 From: Alexandru Macocian Date: Mon, 24 Feb 2020 15:53:15 +0100 Subject: [PATCH] Implemented http request templates to provide model directly to http module handlers --- MTSC.UnitTests/E2ETests.cs | 6 +-- MTSC.UnitTests/EchoModule.cs | 4 +- MTSC.UnitTests/TestQueryModule.cs | 4 +- MTSC/Common/Http/HttpRequest.cs | 2 +- MTSC/Common/Http/ITemplatedHttpRequest.cs | 6 --- .../Http/RoutingModules/Http200Module.cs | 4 +- .../Http/RoutingModules/HttpRouteBase.cs | 42 +++++++++++++++++ MTSC/Common/Http/RoutingModules/IHttpRoute.cs | 9 ---- .../Http/ServerModules/HttpRoutingModule.cs | 47 +++++-------------- 9 files changed, 65 insertions(+), 59 deletions(-) delete mode 100644 MTSC/Common/Http/ITemplatedHttpRequest.cs create mode 100644 MTSC/Common/Http/RoutingModules/HttpRouteBase.cs delete mode 100644 MTSC/Common/Http/RoutingModules/IHttpRoute.cs diff --git a/MTSC.UnitTests/E2ETests.cs b/MTSC.UnitTests/E2ETests.cs index f8b1298..0a67eb5 100644 --- a/MTSC.UnitTests/E2ETests.cs +++ b/MTSC.UnitTests/E2ETests.cs @@ -33,9 +33,9 @@ namespace MTSC.UnitTests .AddWebsocketHandler(new Common.WebSockets.ServerModules.EchoModule())) .AddHandler(new HttpHandler() .AddHttpModule(new HttpRoutingModule() - .AddRoute(HttpMessage.HttpMethods.Get, "/", new Http200Module()) - .AddRoute(HttpMessage.HttpMethods.Get, "/query", new TestQueryModule()) - .AddRoute(HttpMessage.HttpMethods.Get, "/echo", new EchoModule())) + .AddRoute(HttpMessage.HttpMethods.Get, "", new Http200Module()) + .AddRoute(HttpMessage.HttpMethods.Get, "query", new TestQueryModule()) + .AddRoute(HttpMessage.HttpMethods.Get, "echo", new EchoModule())) .WithFragmentsExpirationTime(TimeSpan.FromSeconds(1)) .WithMaximumSize(300)) .AddLogger(new ConsoleLogger()) diff --git a/MTSC.UnitTests/EchoModule.cs b/MTSC.UnitTests/EchoModule.cs index 9f06736..6826c62 100644 --- a/MTSC.UnitTests/EchoModule.cs +++ b/MTSC.UnitTests/EchoModule.cs @@ -4,9 +4,9 @@ using MTSC.Server; namespace MTSC.UnitTests { - public class EchoModule : IHttpRoute + public class EchoModule : HttpRouteBase { - HttpResponse IHttpRoute.HandleRequest(HttpRequest request, ClientData client, Server.Server server) + public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server) { return new HttpResponse { BodyString = request.BodyString, StatusCode = HttpMessage.StatusCodes.OK }; } diff --git a/MTSC.UnitTests/TestQueryModule.cs b/MTSC.UnitTests/TestQueryModule.cs index 32ce325..b9a38d0 100644 --- a/MTSC.UnitTests/TestQueryModule.cs +++ b/MTSC.UnitTests/TestQueryModule.cs @@ -5,9 +5,9 @@ using System.Web; namespace MTSC.UnitTests { - class TestQueryModule : IHttpRoute + class TestQueryModule : HttpRouteBase { - HttpResponse IHttpRoute.HandleRequest(HttpRequest request, ClientData client, Server.Server server) + public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server) { var query = HttpUtility.ParseQueryString(request.RequestQuery); if(query.Count == 2 && diff --git a/MTSC/Common/Http/HttpRequest.cs b/MTSC/Common/Http/HttpRequest.cs index 2bde0a3..aa51e15 100644 --- a/MTSC/Common/Http/HttpRequest.cs +++ b/MTSC/Common/Http/HttpRequest.cs @@ -10,7 +10,7 @@ namespace MTSC.Common.Http /// /// Class encapsulating a http request. /// - public class HttpRequest : ITemplatedHttpRequest + public class HttpRequest { public HttpRequestHeaderDictionary Headers { get; } = new HttpRequestHeaderDictionary(); diff --git a/MTSC/Common/Http/ITemplatedHttpRequest.cs b/MTSC/Common/Http/ITemplatedHttpRequest.cs deleted file mode 100644 index adb879f..0000000 --- a/MTSC/Common/Http/ITemplatedHttpRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace MTSC.Common.Http -{ - public interface ITemplatedHttpRequest - { - } -} diff --git a/MTSC/Common/Http/RoutingModules/Http200Module.cs b/MTSC/Common/Http/RoutingModules/Http200Module.cs index 7d9c988..2d9ca2c 100644 --- a/MTSC/Common/Http/RoutingModules/Http200Module.cs +++ b/MTSC/Common/Http/RoutingModules/Http200Module.cs @@ -2,9 +2,9 @@ namespace MTSC.Common.Http.RoutingModules { - public class Http200Module : IHttpRoute + public class Http200Module : HttpRouteBase { - HttpResponse IHttpRoute.HandleRequest(HttpRequest request, ClientData client, Server.Server server) + public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server) { return new HttpResponse { StatusCode = HttpMessage.StatusCodes.OK }; } diff --git a/MTSC/Common/Http/RoutingModules/HttpRouteBase.cs b/MTSC/Common/Http/RoutingModules/HttpRouteBase.cs new file mode 100644 index 0000000..fac116c --- /dev/null +++ b/MTSC/Common/Http/RoutingModules/HttpRouteBase.cs @@ -0,0 +1,42 @@ +using MTSC.Server; +using System; + +namespace MTSC.Common.Http.RoutingModules +{ + public abstract class HttpRouteBase + { + public HttpResponse CallHandleRequest(HttpRequest request, ClientData client, Server.Server server) + { + return this.HandleRequest(request, client, server); + } + + public abstract HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server); + } + public abstract class HttpRouteBase : HttpRouteBase + { + private Func template; + + public HttpRouteBase(Func template) + { + this.template = template; + } + + public HttpRouteBase() + { + + } + + public HttpRouteBase WithTemplateProvider(Func templateProvider) + { + this.template = templateProvider; + return this; + } + + public override HttpResponse HandleRequest(HttpRequest request, ClientData client, Server.Server server) + { + return HandleRequest(template.Invoke(request), client, server); + } + + public abstract HttpResponse HandleRequest(T request, ClientData client, Server.Server server); + } +} diff --git a/MTSC/Common/Http/RoutingModules/IHttpRoute.cs b/MTSC/Common/Http/RoutingModules/IHttpRoute.cs deleted file mode 100644 index 37689d7..0000000 --- a/MTSC/Common/Http/RoutingModules/IHttpRoute.cs +++ /dev/null @@ -1,9 +0,0 @@ -using MTSC.Server; - -namespace MTSC.Common.Http.RoutingModules -{ - public interface IHttpRoute where T : ITemplatedHttpRequest - { - HttpResponse HandleRequest(T request, ClientData client, Server.Server server); - } -} diff --git a/MTSC/Common/Http/ServerModules/HttpRoutingModule.cs b/MTSC/Common/Http/ServerModules/HttpRoutingModule.cs index 571f51a..8b23837 100644 --- a/MTSC/Common/Http/ServerModules/HttpRoutingModule.cs +++ b/MTSC/Common/Http/ServerModules/HttpRoutingModule.cs @@ -10,59 +10,37 @@ namespace MTSC.Common.Http.ServerModules public class HttpRoutingModule : IHttpModule { private static Func alwaysEnabled = (server, request, client) => RouteEnablerResponse.Accept; - private static Func noTemplate = (request) => request; - private Dictionary, - Func, Func template)>> moduleDictionary = - new Dictionary, - Func, Func)>>(); + private Dictionary)>> moduleDictionary = + new Dictionary)>>(); public HttpRoutingModule() { foreach (HttpMethods method in (HttpMethods[])Enum.GetValues(typeof(HttpMethods))) { - moduleDictionary[method] = new Dictionary, - Func, Func template)>(); + moduleDictionary[method] = new Dictionary)>(); } } public HttpRoutingModule AddRoute( HttpMethods method, string uri, - IHttpRoute routeModule) + HttpRouteBase routeModule) { - moduleDictionary[method][uri] = (routeModule, alwaysEnabled, noTemplate); + moduleDictionary[method][uri] = (routeModule, alwaysEnabled); return this; } public HttpRoutingModule AddRoute( HttpMethods method, string uri, - IHttpRoute routeModule, + HttpRouteBase routeModule, Func routeEnabler) { - moduleDictionary[method][uri] = (routeModule, routeEnabler, noTemplate); - return this; - } - - public HttpRoutingModule AddRoute( - HttpMethods method, - string uri, - IHttpRoute routeModule, - Func requestTemplate) - { - moduleDictionary[method][uri] = (routeModule, alwaysEnabled, requestTemplate); - return this; - } - - public HttpRoutingModule AddRoute( - HttpMethods method, - string uri, - IHttpRoute routeModule, - Func routeEnabler, - Func requestTemplate) - { - moduleDictionary[method][uri] = (routeModule, routeEnabler, requestTemplate); + moduleDictionary[method][uri] = (routeModule, routeEnabler); return this; } @@ -81,13 +59,14 @@ namespace MTSC.Common.Http.ServerModules */ if (moduleDictionary[request.Method].ContainsKey(request.RequestURI)) { - (var module, var routeEnabler, var requestTemplate) = moduleDictionary[request.Method][request.RequestURI]; + (var module, var routeEnabler) = moduleDictionary[request.Method][request.RequestURI]; var routeEnablerResponse = routeEnabler.Invoke(server, request, client); if (routeEnablerResponse is RouteEnablerResponse.RouteEnablerResponseAccept) { try { - response = module.HandleRequest(requestTemplate.Invoke(request), client, server); + response = module.CallHandleRequest(request, client, server); + //response = module.HandleRequest(requestTemplate.Invoke(request), client, server); } catch(Exception e) {