From 0b775bd6090fbc9b56e98ffb64e75d0567b4bf44 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 4 Apr 2019 20:04:08 +0200 Subject: [PATCH] Fix for hosting in subfolder. --- .../Frontend/Middlewares/IndexExtensions.cs | 30 +++++++++ .../Frontend/Middlewares/IndexMiddleware.cs | 66 +++++++++++++++++++ .../Frontend/Middlewares/WebpackMiddleware.cs | 55 +++++----------- src/Squidex/Areas/Frontend/Startup.cs | 14 ++-- src/Squidex/app-config/webpack.config.js | 6 +- src/Squidex/app-config/webpack.run.prod.js | 2 +- src/Squidex/wwwroot/index.html | 2 +- 7 files changed, 130 insertions(+), 45 deletions(-) create mode 100644 src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs create mode 100644 src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs diff --git a/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs b/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs new file mode 100644 index 000000000..b904b0e9a --- /dev/null +++ b/src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs @@ -0,0 +1,30 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using Microsoft.AspNetCore.Http; + +namespace Squidex.Areas.Frontend.Middlewares +{ + public static class IndexExtensions + { + public static bool IsIndexHtml(this HttpContext context) + { + return context.IsIndex() && context.IsHtml(); + } + + public static bool IsIndex(this HttpContext context) + { + return context.Request.Path.Value.EndsWith("/index.html", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsHtml(this HttpContext context) + { + return context.Response.ContentType?.ToLower().Contains("text/html") == true; + } + } +} diff --git a/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs b/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs new file mode 100644 index 000000000..65dea1c28 --- /dev/null +++ b/src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs @@ -0,0 +1,66 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschränkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Squidex.Areas.Frontend.Middlewares +{ + public sealed class IndexMiddleware + { + private readonly RequestDelegate next; + + public IndexMiddleware(RequestDelegate next) + { + this.next = next; + } + + public async Task Invoke(HttpContext context) + { + var basePath = context.Request.PathBase; + + if (context.IsIndex() && basePath.HasValue) + { + var responseBuffer = new MemoryStream(); + var responseBody = context.Response.Body; + + context.Response.Body = responseBuffer; + + await next(context); + + context.Response.Body = responseBody; + + if (context.Response.StatusCode == 200 && context.IsIndexHtml()) + { + var response = Encoding.UTF8.GetString(responseBuffer.ToArray()); + + response = AdjustBase(response, basePath); + + context.Response.ContentLength = Encoding.UTF8.GetByteCount(response); + context.Response.Body = responseBody; + + await context.Response.WriteAsync(response); + } + else if (context.Response.StatusCode != 304) + { + await responseBuffer.CopyToAsync(responseBody); + } + } + else + { + await next(context); + } + } + + private static string AdjustBase(string response, string baseUrl) + { + return response.Replace("", $""); + } + } +} diff --git a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs index 4e4944200..e02d78ae9 100644 --- a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs +++ b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs @@ -10,7 +10,6 @@ using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; -using Microsoft.Net.Http.Headers; namespace Squidex.Areas.Frontend.Middlewares { @@ -29,46 +28,38 @@ namespace Squidex.Areas.Frontend.Middlewares public async Task Invoke(HttpContext context) { - var responseBuffer = new MemoryStream(); - var responseBody = context.Response.Body; + if (context.IsIndex()) + { + var responseBuffer = new MemoryStream(); + var responseBody = context.Response.Body; - context.Response.Body = responseBuffer; + context.Response.Body = responseBuffer; - await next(context); + await next(context); - responseBuffer.Seek(0, SeekOrigin.Begin); + context.Response.Body = responseBody; - if (context.Response.StatusCode == 200 && IsIndex(context) && IsHtml(context)) - { - using (var reader = new StreamReader(responseBuffer)) + if (context.Response.StatusCode == 200 && context.IsIndexHtml()) { - var response = await reader.ReadToEndAsync(); + var response = Encoding.UTF8.GetString(responseBuffer.ToArray()); response = InjectStyles(response); response = InjectScripts(response); - using (var memoryStream = new MemoryStream()) - { - using (var writer = new StreamWriter(memoryStream)) - { - writer.Write(response); - writer.Flush(); - - memoryStream.Seek(0, SeekOrigin.Begin); - - context.Response.Headers[HeaderNames.ContentLength] = memoryStream.Length.ToString(); + context.Response.ContentLength = Encoding.UTF8.GetByteCount(response); + context.Response.Body = responseBody; - await memoryStream.CopyToAsync(responseBody); - } - } + await context.Response.WriteAsync(response); + } + else if (context.Response.StatusCode != 304) + { + await responseBuffer.CopyToAsync(responseBody); } } - else if (context.Response.StatusCode != 304) + else { - await responseBuffer.CopyToAsync(responseBody); + await next(context); } - - context.Response.Body = responseBody; } private static string InjectStyles(string response) @@ -108,15 +99,5 @@ namespace Squidex.Areas.Frontend.Middlewares return response; } - - private static bool IsIndex(HttpContext context) - { - return context.Request.Path.Value.Equals("/index.html", StringComparison.OrdinalIgnoreCase); - } - - private static bool IsHtml(HttpContext context) - { - return context.Response.ContentType?.ToLower().Contains("text/html") == true; - } } } diff --git a/src/Squidex/Areas/Frontend/Startup.cs b/src/Squidex/Areas/Frontend/Startup.cs index dcd10c2b1..875945463 100644 --- a/src/Squidex/Areas/Frontend/Startup.cs +++ b/src/Squidex/Areas/Frontend/Startup.cs @@ -23,10 +23,7 @@ namespace Squidex.Areas.Frontend { var environment = app.ApplicationServices.GetRequiredService(); - if (environment.IsDevelopment()) - { - app.UseMiddleware(); - } + app.UseMiddleware(); app.Use((context, next) => { @@ -53,7 +50,14 @@ namespace Squidex.Areas.Frontend return next(); }); - app.UseMiddleware(); + if (environment.IsDevelopment()) + { + app.UseMiddleware(); + } + else + { + app.UseMiddleware(); + } app.UseStaticFiles(new StaticFileOptions { diff --git a/src/Squidex/app-config/webpack.config.js b/src/Squidex/app-config/webpack.config.js index 6b7981e5b..3af7f467c 100644 --- a/src/Squidex/app-config/webpack.config.js +++ b/src/Squidex/app-config/webpack.config.js @@ -83,7 +83,11 @@ module.exports = { }, { test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/, use: [{ - loader: 'file-loader?name=assets/[name].[hash].[ext]' + loader: 'file-loader?name=assets/[name].[hash].[ext]', + options: { + publicPath: 'assets/', + outputPath: 'assets' + } }] }, { test: /\.(png|jpe?g|gif|svg|ico)(\?.*$|$)/, diff --git a/src/Squidex/app-config/webpack.run.prod.js b/src/Squidex/app-config/webpack.run.prod.js index 9ded6e3c5..07fbca634 100644 --- a/src/Squidex/app-config/webpack.run.prod.js +++ b/src/Squidex/app-config/webpack.run.prod.js @@ -30,7 +30,7 @@ module.exports = webpackMerge(runConfig, { */ path: helpers.root('wwwroot/build/'), - publicPath: '/build/', + publicPath: './build/', /** * Specifies the name of each output file on disk. diff --git a/src/Squidex/wwwroot/index.html b/src/Squidex/wwwroot/index.html index 8387227e9..54a134c2f 100644 --- a/src/Squidex/wwwroot/index.html +++ b/src/Squidex/wwwroot/index.html @@ -41,7 +41,7 @@
- +
Loading Squidex