From 7cd772de4a61f1bf26d9c1079466188a835176c9 Mon Sep 17 00:00:00 2001 From: Alexanderius Date: Sat, 6 Apr 2024 21:06:34 +0500 Subject: [PATCH] [add] request handling pipeline with handlers --- .../ApplicationBuilderExtensions.cs | 6 ++--- .../Core2/PageComposition/IPageRenderer.cs | 16 +++++++++++++ .../Handlers/PageRenderingHandler.cs | 14 +++++++++++ .../Handlers/StaticFilesHandler.cs | 16 +++++++++++++ .../Core2/RequestHandling/IRequestHandler.cs | 9 +++++++ .../IRequestHandlingPipeline.cs | 2 +- .../Core2/RequestHandling/RequestHandler.cs | 5 ++++ .../Core2/RequestHandlingStatus.cs | 17 ------------- .../Core2/ScopeRequestProcessExtensions.cs | 2 +- .../StaticFiles/IStaticFileRequestHandler.cs | 24 +++++++++++++++++++ .../SimplifyWebRequestMiddleware.cs | 12 ++++------ 11 files changed, 94 insertions(+), 29 deletions(-) create mode 100644 src/Simplify.Web/Core2/PageComposition/IPageRenderer.cs create mode 100644 src/Simplify.Web/Core2/RequestHandling/Handlers/PageRenderingHandler.cs create mode 100644 src/Simplify.Web/Core2/RequestHandling/Handlers/StaticFilesHandler.cs create mode 100644 src/Simplify.Web/Core2/RequestHandling/IRequestHandler.cs create mode 100644 src/Simplify.Web/Core2/RequestHandling/RequestHandler.cs delete mode 100644 src/Simplify.Web/Core2/RequestHandlingStatus.cs create mode 100644 src/Simplify.Web/Core2/StaticFiles/IStaticFileRequestHandler.cs diff --git a/src/Simplify.Web/ApplicationBuilderExtensions.cs b/src/Simplify.Web/ApplicationBuilderExtensions.cs index 4752dc6f..80b7e534 100644 --- a/src/Simplify.Web/ApplicationBuilderExtensions.cs +++ b/src/Simplify.Web/ApplicationBuilderExtensions.cs @@ -1,7 +1,7 @@ using System; +using System.Net; using Microsoft.AspNetCore.Builder; using Simplify.Web.Bootstrapper; -using Simplify.Web.Core2; using Simplify.Web.Middleware; namespace Simplify.Web; @@ -98,9 +98,9 @@ public static IApplicationBuilder UseSimplifyWebNonTerminalWithoutRegistrations( private static void RegisterAsNonTerminal(this IApplicationBuilder builder) => builder.Use(async (context, next) => { - var result = await SimplifyWebRequestMiddleware.InvokeAsNonTerminal(context); + await SimplifyWebRequestMiddleware.InvokeAsNonTerminal(context); - if (result == RequestHandlingStatus.Unhandled) + if (context.Response.StatusCode == (int)HttpStatusCode.NotFound) await next.Invoke(); }); diff --git a/src/Simplify.Web/Core2/PageComposition/IPageRenderer.cs b/src/Simplify.Web/Core2/PageComposition/IPageRenderer.cs new file mode 100644 index 00000000..30b7a068 --- /dev/null +++ b/src/Simplify.Web/Core2/PageComposition/IPageRenderer.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Simplify.Web.Core2.Http; + +namespace Simplify.Web.Core2.PageComposition; + +/// +/// Represent web-page processor. +/// +public interface IPageRenderer +{ + /// + /// Processes (build web-page and send to client, process current page state) the current web-page. + /// + /// The context. + Task Render(IHttpContext context); +} \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandling/Handlers/PageRenderingHandler.cs b/src/Simplify.Web/Core2/RequestHandling/Handlers/PageRenderingHandler.cs new file mode 100644 index 00000000..0e38a47c --- /dev/null +++ b/src/Simplify.Web/Core2/RequestHandling/Handlers/PageRenderingHandler.cs @@ -0,0 +1,14 @@ +using System.Threading.Tasks; +using Simplify.Web.Core2.Http; +using Simplify.Web.Core2.PageComposition; + +namespace Simplify.Web.Core2.RequestHandling.Handlers; + +public class PageRenderingHandler(IPageRenderer renderer) : IRequestHandler +{ + public async Task Execute(IHttpContext context, RequestHandler next) + { + await renderer.Render(context); + await next(); + } +} \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandling/Handlers/StaticFilesHandler.cs b/src/Simplify.Web/Core2/RequestHandling/Handlers/StaticFilesHandler.cs new file mode 100644 index 00000000..8dd199cd --- /dev/null +++ b/src/Simplify.Web/Core2/RequestHandling/Handlers/StaticFilesHandler.cs @@ -0,0 +1,16 @@ +using System.Threading.Tasks; +using Simplify.Web.Core2.Http; +using Simplify.Web.Core2.StaticFiles; + +namespace Simplify.Web.Core2.RequestHandling.Handlers; + +public class StaticFilesHandler(IStaticFileRequestHandler handler) : IRequestHandler +{ + public async Task Execute(IHttpContext context, RequestHandler next) + { + if (handler.IsStaticFileRoutePath(context)) + await handler.Execute(context); + else + await next(); + } +} \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandling/IRequestHandler.cs b/src/Simplify.Web/Core2/RequestHandling/IRequestHandler.cs new file mode 100644 index 00000000..8b8e98f0 --- /dev/null +++ b/src/Simplify.Web/Core2/RequestHandling/IRequestHandler.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using Simplify.Web.Core2.Http; + +namespace Simplify.Web.Core2.RequestHandling; + +public interface IRequestHandler +{ + Task Execute(IHttpContext context, RequestHandler next); +} \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandling/IRequestHandlingPipeline.cs b/src/Simplify.Web/Core2/RequestHandling/IRequestHandlingPipeline.cs index 439b83f1..45487f18 100644 --- a/src/Simplify.Web/Core2/RequestHandling/IRequestHandlingPipeline.cs +++ b/src/Simplify.Web/Core2/RequestHandling/IRequestHandlingPipeline.cs @@ -5,5 +5,5 @@ namespace Simplify.Web.Core2.RequestHandling; public interface IRequestHandlingPipeline { - Task Execute(IHttpContext context); + Task Execute(IHttpContext context); } \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandling/RequestHandler.cs b/src/Simplify.Web/Core2/RequestHandling/RequestHandler.cs new file mode 100644 index 00000000..692f58c4 --- /dev/null +++ b/src/Simplify.Web/Core2/RequestHandling/RequestHandler.cs @@ -0,0 +1,5 @@ +using System.Threading.Tasks; + +namespace Simplify.Web.Core2.RequestHandling; + +public delegate Task RequestHandler(); \ No newline at end of file diff --git a/src/Simplify.Web/Core2/RequestHandlingStatus.cs b/src/Simplify.Web/Core2/RequestHandlingStatus.cs deleted file mode 100644 index a8385986..00000000 --- a/src/Simplify.Web/Core2/RequestHandlingStatus.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Simplify.Web.Core2; - -/// -/// Provides request handling status. -/// -public enum RequestHandlingStatus -{ - /// - /// The request was unhandled. - /// - Unhandled = 0, - - /// - /// The request was handled. - /// - Handled = 1, -} \ No newline at end of file diff --git a/src/Simplify.Web/Core2/ScopeRequestProcessExtensions.cs b/src/Simplify.Web/Core2/ScopeRequestProcessExtensions.cs index 7bb815d0..4a2bceb2 100644 --- a/src/Simplify.Web/Core2/ScopeRequestProcessExtensions.cs +++ b/src/Simplify.Web/Core2/ScopeRequestProcessExtensions.cs @@ -15,6 +15,6 @@ public static class ScopeRequestProcessExtensions /// /// The scope. /// The context. - public static Task ProcessRequest(this ILifetimeScope scope, IHttpContext context) => + public static Task ProcessRequest(this ILifetimeScope scope, IHttpContext context) => scope.Resolver.Resolve().Execute(context); } \ No newline at end of file diff --git a/src/Simplify.Web/Core2/StaticFiles/IStaticFileRequestHandler.cs b/src/Simplify.Web/Core2/StaticFiles/IStaticFileRequestHandler.cs new file mode 100644 index 00000000..7fc4f38c --- /dev/null +++ b/src/Simplify.Web/Core2/StaticFiles/IStaticFileRequestHandler.cs @@ -0,0 +1,24 @@ +using System.Threading.Tasks; +using Simplify.Web.Core2.Http; + +namespace Simplify.Web.Core2.StaticFiles; + +/// +/// Represent static files request handler. +/// +public interface IStaticFileRequestHandler +{ + /// + /// Determines whether current route path is for static file. + /// + /// The context. + /// + bool IsStaticFileRoutePath(IHttpContext context); + + /// + /// Processes the HTTP request for static files. + /// + /// The context. + /// + Task Execute(IHttpContext context); +} \ No newline at end of file diff --git a/src/Simplify.Web/Middleware/SimplifyWebRequestMiddleware.cs b/src/Simplify.Web/Middleware/SimplifyWebRequestMiddleware.cs index 26a756d6..c083b829 100644 --- a/src/Simplify.Web/Middleware/SimplifyWebRequestMiddleware.cs +++ b/src/Simplify.Web/Middleware/SimplifyWebRequestMiddleware.cs @@ -27,16 +27,16 @@ public static class SimplifyWebRequestMiddleware /// public static event TraceEventHandler? OnTrace; - public static Task InvokeAsTerminal(Microsoft.AspNetCore.Http.HttpContext context) => Invoke(context, true); + public static Task InvokeAsTerminal(HttpContext context) => Invoke(context, true); - public static Task InvokeAsNonTerminal(Microsoft.AspNetCore.Http.HttpContext context) => Invoke(context, false); + public static Task InvokeAsNonTerminal(HttpContext context) => Invoke(context, false); /// /// Process an individual request. /// /// The context. /// if set to true [is terminal middleware]. - public static async Task Invoke(Microsoft.AspNetCore.Http.HttpContext context, bool isTerminalMiddleware) + public static async Task Invoke(HttpContext context, bool isTerminalMiddleware) { using var scope = BootstrapperFactory.ContainerProvider.BeginLifetimeScope(); @@ -44,7 +44,7 @@ public static async Task Invoke(Microsoft.AspNetCore.Http try { - return await scope.StartMeasurements() + await scope.StartMeasurements() .Trace(context, OnTrace) .SetupProviders(localContext) .ProcessRequest(localContext); @@ -63,8 +63,6 @@ public static async Task Invoke(Microsoft.AspNetCore.Http } await context.WriteErrorResponse(scope, e); - - return RequestHandlingStatus.Handled; } } @@ -78,7 +76,7 @@ internal static bool ProcessOnException(Exception e) return true; } - private static async Task WriteErrorResponse(this Microsoft.AspNetCore.Http.HttpContext context, ILifetimeScope scope, Exception e) + private static async Task WriteErrorResponse(this HttpContext context, ILifetimeScope scope, Exception e) { var webContext = scope.Resolver.Resolve().Get();