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. 55
      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}/\">");
}
}
}

55
src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs

@ -10,7 +10,6 @@ using System.IO;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.Net.Http.Headers;
namespace Squidex.Areas.Frontend.Middlewares namespace Squidex.Areas.Frontend.Middlewares
{ {
@ -29,46 +28,38 @@ namespace Squidex.Areas.Frontend.Middlewares
public async Task Invoke(HttpContext context) public async Task Invoke(HttpContext context)
{ {
var responseBuffer = new MemoryStream(); if (context.IsIndex())
var responseBody = context.Response.Body; {
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)) if (context.Response.StatusCode == 200 && context.IsIndexHtml())
{
using (var reader = new StreamReader(responseBuffer))
{ {
var response = await reader.ReadToEndAsync(); var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
response = InjectStyles(response); response = InjectStyles(response);
response = InjectScripts(response); response = InjectScripts(response);
using (var memoryStream = new MemoryStream()) context.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
{ context.Response.Body = responseBody;
using (var writer = new StreamWriter(memoryStream))
{
writer.Write(response);
writer.Flush();
memoryStream.Seek(0, SeekOrigin.Begin);
context.Response.Headers[HeaderNames.ContentLength] = memoryStream.Length.ToString();
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) private static string InjectStyles(string response)
@ -108,15 +99,5 @@ namespace Squidex.Areas.Frontend.Middlewares
return response; 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>(); var environment = app.ApplicationServices.GetRequiredService<IHostingEnvironment>();
if (environment.IsDevelopment()) app.UseMiddleware<SquidMiddleware>();
{
app.UseMiddleware<WebpackMiddleware>();
}
app.Use((context, next) => app.Use((context, next) =>
{ {
@ -53,7 +50,14 @@ namespace Squidex.Areas.Frontend
return next(); return next();
}); });
app.UseMiddleware<SquidMiddleware>(); if (environment.IsDevelopment())
{
app.UseMiddleware<WebpackMiddleware>();
}
else
{
app.UseMiddleware<IndexMiddleware>();
}
app.UseStaticFiles(new StaticFileOptions app.UseStaticFiles(new StaticFileOptions
{ {

6
src/Squidex/app-config/webpack.config.js

@ -83,7 +83,11 @@ module.exports = {
}, { }, {
test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/, test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/,
use: [{ 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)(\?.*$|$)/, 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/'), path: helpers.root('wwwroot/build/'),
publicPath: '/build/', publicPath: './build/',
/** /**
* Specifies the name of each output file on disk. * Specifies the name of each output file on disk.

2
src/Squidex/wwwroot/index.html

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

Loading…
Cancel
Save