diff --git a/src/Umbraco.Core/UriExtensions.cs b/src/Umbraco.Core/UriExtensions.cs index 0452373d55..ea846f7f7a 100644 --- a/src/Umbraco.Core/UriExtensions.cs +++ b/src/Umbraco.Core/UriExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using Microsoft.Extensions.Logging; @@ -100,16 +100,13 @@ namespace Umbraco.Core return false; } - //if its anything else we can assume it's back office + // if its anything else we can assume it's back office return true; } /// /// Checks if the current uri is an install request /// - /// - /// - /// public static bool IsInstallerRequest(this Uri url, IHostingEnvironment hostingEnvironment) { var authority = url.GetLeftPart(UriPartial.Authority); @@ -117,18 +114,14 @@ namespace Umbraco.Core .TrimStart(authority) .TrimStart("/"); - //check if this is in the umbraco back office + // check if this is in the umbraco back office return afterAuthority.InvariantStartsWith(hostingEnvironment.ToAbsolute(Constants.SystemDirectories.Install).TrimStart("/")); } /// /// Checks if the uri is a request for the default back office page /// - /// - /// - /// - /// - internal static bool IsDefaultBackOfficeRequest(this Uri url, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) + public static bool IsDefaultBackOfficeRequest(this Uri url, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) { var backOfficePath = globalSettings.GetBackOfficePath(hostingEnvironment); if (url.AbsolutePath.InvariantEquals(backOfficePath.TrimEnd("/")) @@ -138,6 +131,7 @@ namespace Umbraco.Core { return true; } + return false; } diff --git a/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs b/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs index 69fae56d32..fe61941e5c 100644 --- a/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Text; @@ -18,27 +18,20 @@ namespace Umbraco.Extensions /// /// Check if a preview cookie exist /// - /// - /// public static bool HasPreviewCookie(this HttpRequest request) - { - return request.Cookies.TryGetValue(Constants.Web.PreviewCookieName, out var cookieVal) && !cookieVal.IsNullOrWhiteSpace(); - } + => request.Cookies.TryGetValue(Constants.Web.PreviewCookieName, out var cookieVal) && !cookieVal.IsNullOrWhiteSpace(); public static bool IsBackOfficeRequest(this HttpRequest request, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) - { - return new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsBackOfficeRequest(globalSettings, hostingEnvironment); - } + => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsBackOfficeRequest(globalSettings, hostingEnvironment); public static bool IsClientSideRequest(this HttpRequest request) - { - return new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsClientSideRequest(); - } + => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsClientSideRequest(); + + public static bool IsDefaultBackOfficeRequest(this HttpRequest request, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment) + => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsDefaultBackOfficeRequest(globalSettings, hostingEnvironment); public static string ClientCulture(this HttpRequest request) - { - return request.Headers.TryGetValue("X-UMB-CULTURE", out var values) ? values[0] : null; - } + => request.Headers.TryGetValue("X-UMB-CULTURE", out var values) ? values[0] : null; /// /// Determines if a request is local. diff --git a/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs b/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs index 32d84088c1..438ad154ed 100644 --- a/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs +++ b/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs @@ -38,10 +38,10 @@ namespace Umbraco.Extensions { app.UseEndpoints(endpoints => { - endpoints.MapDynamicControllerRoute("/{**slug}"); - NoContentRoutes noContentRoutes = app.ApplicationServices.GetRequiredService(); noContentRoutes.CreateRoutes(endpoints); + + endpoints.MapDynamicControllerRoute("/{**slug}"); }); return app; diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs index be7c9f7409..c41f34acc6 100644 --- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs +++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs @@ -4,14 +4,18 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Umbraco.Core; using Umbraco.Core.Composing; +using Umbraco.Core.Configuration.Models; +using Umbraco.Core.Hosting; using Umbraco.Core.Models.PublishedContent; using Umbraco.Core.Strings; using Umbraco.Extensions; @@ -42,6 +46,8 @@ namespace Umbraco.Web.Website.Routing private readonly IShortStringHelper _shortStringHelper; private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider; private readonly IPublishedRouter _publishedRouter; + private readonly GlobalSettings _globalSettings; + private readonly IHostingEnvironment _hostingEnvironment; /// /// Initializes a new instance of the class. @@ -52,7 +58,9 @@ namespace Umbraco.Web.Website.Routing IUmbracoRenderingDefaults renderingDefaults, IShortStringHelper shortStringHelper, IActionDescriptorCollectionProvider actionDescriptorCollectionProvider, - IPublishedRouter publishedRouter) + IPublishedRouter publishedRouter, + IOptions globalSettings, + IHostingEnvironment hostingEnvironment) { _logger = logger; _umbracoContextAccessor = umbracoContextAccessor; @@ -60,19 +68,32 @@ namespace Umbraco.Web.Website.Routing _shortStringHelper = shortStringHelper; _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider; _publishedRouter = publishedRouter; + _globalSettings = globalSettings.Value; + _hostingEnvironment = hostingEnvironment; } /// public override async ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values) { + // will be null for any client side requests like JS, etc... if (_umbracoContextAccessor.UmbracoContext == null) { - throw new InvalidOperationException($"There is no current UmbracoContext, it must be initialized before the {nameof(UmbracoRouteValueTransformer)} executes, ensure that {nameof(UmbracoRequestMiddleware)} is registered prior to 'UseRouting'"); + return values; + // throw new InvalidOperationException($"There is no current UmbracoContext, it must be initialized before the {nameof(UmbracoRouteValueTransformer)} executes, ensure that {nameof(UmbracoRequestMiddleware)} is registered prior to 'UseRouting'"); + } + + // Check for back office request + // TODO: This is how the module was doing it before but could just as easily be part of the RoutableDocumentFilter + // which still needs to be migrated. + if (httpContext.Request.IsDefaultBackOfficeRequest(_globalSettings, _hostingEnvironment)) + { + return values; } bool routed = RouteRequest(_umbracoContextAccessor.UmbracoContext, out IPublishedRequest publishedRequest); if (!routed) { + return values; // TODO: Deal with it not being routable, perhaps this should be an enum result? }