diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs index c83f71875..fc92c80ab 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Scripting/ScriptExecutionContext.cs @@ -49,7 +49,7 @@ public sealed class ScriptExecutionContext : ScriptExecutionContext, ISchedul { TryComplete(); - var result = await tcs.Task.WithCancellation(default); + var result = await tcs.Task.WithCancellation(cancellationToken); if (result == null) { return fallback(); diff --git a/backend/src/Squidex.Web/PathBaseMiddlewareExtensions.cs b/backend/src/Squidex.Web/PathBaseMiddlewareExtensions.cs new file mode 100644 index 000000000..4e93256d8 --- /dev/null +++ b/backend/src/Squidex.Web/PathBaseMiddlewareExtensions.cs @@ -0,0 +1,47 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Squidex.Hosting; + +namespace Squidex.Web; + +public static class PathBaseMiddlewareExtensions +{ + public static IApplicationBuilder UseFallbackPathBase(this IApplicationBuilder app) + { + var urlGenerator = app.ApplicationServices.GetRequiredService(); + + var configuredBase = urlGenerator.BuildBasePath(); + if (string.IsNullOrWhiteSpace(configuredBase) || configuredBase == "/") + { + return app; + } + + var pathBase = new PathString(configuredBase); + + return app.Use(async (context, next) => + { + if (context.Request.PathBase.HasValue) + { + await next(); + return; + } + + context.Request.PathBase = pathBase; + + if (context.Request.Path.StartsWithSegments(pathBase, StringComparison.Ordinal, out var remainder)) + { + context.Request.Path = remainder; + } + + await next(); + }); + } +} diff --git a/backend/src/Squidex.Web/Resources.cs b/backend/src/Squidex.Web/Resources.cs index 69030ab51..76f50e228 100644 --- a/backend/src/Squidex.Web/Resources.cs +++ b/backend/src/Squidex.Web/Resources.cs @@ -170,7 +170,6 @@ public sealed class Resources(ApiController controller) var url = Controller.Url(action, values); var basePath = Controller.HttpContext.Request.PathBase; - if (url.StartsWith(Controller.HttpContext.Request.PathBase, StringComparison.OrdinalIgnoreCase)) { url = url[basePath.Value!.Length..]; diff --git a/backend/src/Squidex/Startup.cs b/backend/src/Squidex/Startup.cs index d41aacc67..d19ebd7bb 100644 --- a/backend/src/Squidex/Startup.cs +++ b/backend/src/Squidex/Startup.cs @@ -73,7 +73,7 @@ public sealed class Startup(IConfiguration config) { app.UseWebSockets(); app.UseCookiePolicy(); - app.UseDefaultPathBase(); + app.UseFallbackPathBase(); app.UseDefaultForwardRules(); app.UseSquidexLogging(); app.UseSquidexLocalization();