Browse Source

Add compression. (#1210)

pull/1214/head
Sebastian Stehle 2 years ago
committed by GitHub
parent
commit
59d0d383e9
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 21
      backend/src/Squidex.Web/CompressionOptions.cs
  2. 34
      backend/src/Squidex/Config/Web/WebExtensions.cs
  3. 27
      backend/src/Squidex/Config/Web/WebServices.cs
  4. 6
      backend/src/Squidex/Startup.cs
  5. 18
      backend/src/Squidex/appsettings.json

21
backend/src/Squidex.Web/CompressionOptions.cs

@ -0,0 +1,21 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.IO.Compression;
namespace Squidex.Web;
public class CompressionOptions
{
public bool Enabled { get; set; }
public bool EnableForHttps { get; set; }
public CompressionLevel LevelGzip { get; set; } = CompressionLevel.Fastest;
public CompressionLevel LevelBrotli { get; set; } = CompressionLevel.Fastest;
}

34
backend/src/Squidex/Config/Web/WebExtensions.cs

@ -7,9 +7,11 @@
using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Options;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json;
using Squidex.Pipeline.Robots; using Squidex.Pipeline.Robots;
using Squidex.Web;
using Squidex.Web.Pipeline; using Squidex.Web.Pipeline;
namespace Squidex.Config.Web; namespace Squidex.Config.Web;
@ -19,14 +21,12 @@ public static class WebExtensions
public static IApplicationBuilder UseSquidexCacheKeys(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexCacheKeys(this IApplicationBuilder app)
{ {
app.UseMiddleware<CachingKeysMiddleware>(); app.UseMiddleware<CachingKeysMiddleware>();
return app; return app;
} }
public static IApplicationBuilder UseSquidexLocalCache(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexLocalCache(this IApplicationBuilder app)
{ {
app.UseMiddleware<LocalCacheMiddleware>(); app.UseMiddleware<LocalCacheMiddleware>();
return app; return app;
} }
@ -40,28 +40,30 @@ public static class WebExtensions
.AddSupportedUICultures(supportedCultures); .AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions); app.UseRequestLocalization(localizationOptions);
return app; return app;
} }
public static IApplicationBuilder UseSquidexLogging(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexLogging(this IApplicationBuilder app)
{ {
app.UseMiddleware<RequestLogPerformanceMiddleware>(); app.UseMiddleware<RequestLogPerformanceMiddleware>();
return app; return app;
} }
public static IApplicationBuilder UseSquidexUsage(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexUsage(this IApplicationBuilder app)
{ {
app.UseMiddleware<UsageMiddleware>(); app.UseMiddleware<UsageMiddleware>();
return app; return app;
} }
public static IApplicationBuilder UseSquidexExceptionHandling(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexExceptionHandling(this IApplicationBuilder app)
{ {
app.UseMiddleware<RequestExceptionMiddleware>(); app.UseMiddleware<RequestExceptionMiddleware>();
return app;
}
public static IApplicationBuilder UseSquidexRobotsTxt(this IApplicationBuilder app)
{
app.Map("/robots.txt", builder => builder.UseMiddleware<RobotsTxtMiddleware>());
return app; return app;
} }
@ -117,19 +119,25 @@ public static class WebExtensions
return app; return app;
} }
public static IApplicationBuilder UseSquidexRobotsTxt(this IApplicationBuilder app) public static IApplicationBuilder UseSquidexCors(this IApplicationBuilder app)
{
app.Map("/robots.txt", builder => builder.UseMiddleware<RobotsTxtMiddleware>());
return app;
}
public static void UseSquidexCors(this IApplicationBuilder app)
{ {
app.UseCors(builder => builder app.UseCors(builder => builder
.SetIsOriginAllowed(x => true) .SetIsOriginAllowed(x => true)
.AllowCredentials() .AllowCredentials()
.AllowAnyMethod() .AllowAnyMethod()
.AllowAnyHeader()); .AllowAnyHeader());
return app;
}
public static IApplicationBuilder UseSquidexCompression(this IApplicationBuilder app)
{
var compressionOptions = app.ApplicationServices.GetRequiredService<IOptions<CompressionOptions>>().Value;
if (compressionOptions.Enabled)
{
app.UseResponseCompression();
}
return app;
} }
} }

27
backend/src/Squidex/Config/Web/WebServices.cs

@ -11,6 +11,7 @@ using GraphQL.Server.Transports.AspNetCore;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Squidex.Config.Domain; using Squidex.Config.Domain;
@ -31,6 +32,9 @@ public static class WebServices
{ {
public static void AddSquidexMvcWithPlugins(this IServiceCollection services, IConfiguration config) public static void AddSquidexMvcWithPlugins(this IServiceCollection services, IConfiguration config)
{ {
services.Configure<CompressionOptions>(config,
"compression");
services.AddSingletonAs(c => new ExposedValues(c.GetRequiredService<IOptions<ExposedConfiguration>>().Value, config, typeof(WebServices).Assembly)) services.AddSingletonAs(c => new ExposedValues(c.GetRequiredService<IOptions<ExposedConfiguration>>().Value, config, typeof(WebServices).Assembly))
.AsSelf(); .AsSelf();
@ -79,6 +83,29 @@ public static class WebServices
.AutoCleanup() .AutoCleanup()
.AddWebSockets(); .AddWebSockets();
services.Configure<ResponseCompressionOptions>((services, options) =>
{
var compressionOptions = services.GetRequiredService<IOptions<CompressionOptions>>().Value;
options.EnableForHttps = compressionOptions.EnableForHttps;
});
services.Configure<BrotliCompressionProviderOptions>((services, options) =>
{
var compressionOptions = services.GetRequiredService<IOptions<CompressionOptions>>().Value;
options.Level = compressionOptions.LevelBrotli;
});
services.Configure<GzipCompressionProviderOptions>((services, options) =>
{
var compressionOptions = services.GetRequiredService<IOptions<CompressionOptions>>().Value;
options.Level = compressionOptions.LevelGzip;
});
services.AddResponseCompression();
services.AddMvc(options => services.AddMvc(options =>
{ {
// Never change this order here. // Never change this order here.

6
backend/src/Squidex/Startup.cs

@ -71,16 +71,18 @@ public sealed class Startup(IConfiguration config)
public void Configure(IApplicationBuilder app) public void Configure(IApplicationBuilder app)
{ {
app.UseWebSockets(); app.UseWebSockets();
app.UseCookiePolicy(); app.UseCookiePolicy();
app.UseDefaultPathBase(); app.UseDefaultPathBase();
app.UseDefaultForwardRules(); app.UseDefaultForwardRules();
app.UseSquidexHealthCheck();
app.UseSquidexRobotsTxt();
app.UseSquidexLogging(); app.UseSquidexLogging();
app.UseSquidexLocalization(); app.UseSquidexLocalization();
app.UseSquidexLocalCache(); app.UseSquidexLocalCache();
app.UseSquidexCors(); app.UseSquidexCors();
app.UseSquidexCompression();
app.UseSquidexHealthCheck();
app.UseSquidexRobotsTxt();
app.UseOpenApi(options => app.UseOpenApi(options =>
{ {

18
backend/src/Squidex/appsettings.json

@ -4,6 +4,24 @@
"isReadonly": false "isReadonly": false
}, },
"compression": {
// Indicates if responses over HTTPS connections should be compressed.
"enableForHttps": true,
// Enables compression.
"enabled": false,
// The compression level for gzip.
//
// SUPPORTED: Fastest (default), OptimOptimal, SmallestSize, NoCompression
"levelGzip": "Fastest",
// The compression level for brotli.
//
// SUPPORTED: Fastest (default), OptimOptimal, SmallestSize, NoCompression
"levelBrotli": "Fastest"
},
"urls": { "urls": {
// Set the base url of your application, to generate correct urls in background process. // Set the base url of your application, to generate correct urls in background process.
"baseUrl": "https://localhost:5001", "baseUrl": "https://localhost:5001",

Loading…
Cancel
Save