Browse Source

Fix for hosting in subfolder.

pull/352/head
Sebastian Stehle 7 years ago
parent
commit
0b775bd609
  1. 30
      src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs
  2. 66
      src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs
  3. 45
      src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
  4. 14
      src/Squidex/Areas/Frontend/Startup.cs
  5. 6
      src/Squidex/app-config/webpack.config.js
  6. 2
      src/Squidex/app-config/webpack.run.prod.js
  7. 2
      src/Squidex/wwwroot/index.html

30
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;
}
}
}

66
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("<base href=\"/\">", $"<base href=\"{baseUrl}/\">");
}
}
}

45
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
{
@ -28,6 +27,8 @@ namespace Squidex.Areas.Frontend.Middlewares
}
public async Task Invoke(HttpContext context)
{
if (context.IsIndex())
{
var responseBuffer = new MemoryStream();
var responseBody = context.Response.Body;
@ -36,39 +37,29 @@ namespace Squidex.Areas.Frontend.Middlewares
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);
}
context.Response.Body = responseBody;
}
else
{
await next(context);
}
}
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;
}
}
}

14
src/Squidex/Areas/Frontend/Startup.cs

@ -23,10 +23,7 @@ namespace Squidex.Areas.Frontend
{
var environment = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();
if (environment.IsDevelopment())
{
app.UseMiddleware<WebpackMiddleware>();
}
app.UseMiddleware<SquidMiddleware>();
app.Use((context, next) =>
{
@ -53,7 +50,14 @@ namespace Squidex.Areas.Frontend
return next();
});
app.UseMiddleware<SquidMiddleware>();
if (environment.IsDevelopment())
{
app.UseMiddleware<WebpackMiddleware>();
}
else
{
app.UseMiddleware<IndexMiddleware>();
}
app.UseStaticFiles(new StaticFileOptions
{

6
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)(\?.*$|$)/,

2
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.

2
src/Squidex/wwwroot/index.html

@ -41,7 +41,7 @@
<body>
<sqx-app>
<div class="loading">
<img src="/images/loader.gif" />
<img src="./images/loader.gif" />
<div>Loading Squidex</div>
</div>

Loading…
Cancel
Save