From dfbb182a9459266200e2b38dde77259326e7e801 Mon Sep 17 00:00:00 2001 From: nikolajlauridsen Date: Mon, 28 Feb 2022 17:29:11 +0100 Subject: [PATCH 1/4] Handle invariant culture in RedirectTrackingHandler GetRouteById and RedirectUrlService expects the culture to be null if it's invariant, however, Cultures in IPublished content uses empty string for invariant culture --- .../Routing/RedirectTrackingHandler.cs | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs index 7f99b32b02..f7c4a8ef0a 100644 --- a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs +++ b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs @@ -99,25 +99,33 @@ namespace Umbraco.Cms.Core.Routing { return; } - var contentCache = publishedSnapshot.Content; - var entityContent = contentCache?.GetById(entity.Id); + + IPublishedContentCache contentCache = publishedSnapshot.Content; + IPublishedContent entityContent = contentCache?.GetById(entity.Id); if (entityContent == null) + { return; + } // get the default affected cultures by going up the tree until we find the first culture variant entity (default to no cultures) var defaultCultures = entityContent.AncestorsOrSelf()?.FirstOrDefault(a => a.Cultures.Any())?.Cultures.Keys.ToArray() ?? new[] { (string)null }; - foreach (var x in entityContent.DescendantsOrSelf(_variationContextAccessor)) + + foreach (IPublishedContent publishedContent in entityContent.DescendantsOrSelf(_variationContextAccessor)) { // if this entity defines specific cultures, use those instead of the default ones - var cultures = x.Cultures.Any() ? x.Cultures.Keys : defaultCultures; + IEnumerable cultures = publishedContent.Cultures.Any() ? publishedContent.Cultures.Keys : defaultCultures; foreach (var culture in cultures) { - var route = contentCache.GetRouteById(x.Id, culture); + var checkedCulture = string.IsNullOrEmpty(culture) ? null : culture; + var route = contentCache.GetRouteById(publishedContent.Id, checkedCulture); if (IsNotRoute(route)) + { continue; - oldRoutes[new ContentIdAndCulture(x.Id, culture)] = new ContentKeyAndOldRoute(x.Key, route); + } + + oldRoutes[new ContentIdAndCulture(publishedContent.Id, culture)] = new ContentKeyAndOldRoute(publishedContent.Key, route); } } } @@ -135,14 +143,18 @@ namespace Umbraco.Cms.Core.Routing { _logger.LogWarning("Could not track redirects because there is no current published snapshot available."); return; - } + } - foreach (var oldRoute in oldRoutes) + foreach (KeyValuePair oldRoute in oldRoutes) { - var newRoute = contentCache.GetRouteById(oldRoute.Key.ContentId, oldRoute.Key.Culture); + var culture = string.IsNullOrWhiteSpace(oldRoute.Key.Culture) ? null : oldRoute.Key.Culture; + var newRoute = contentCache.GetRouteById(oldRoute.Key.ContentId, culture); if (IsNotRoute(newRoute) || oldRoute.Value.OldRoute == newRoute) + { continue; - _redirectUrlService.Register(oldRoute.Value.OldRoute, oldRoute.Value.ContentKey, oldRoute.Key.Culture); + } + + _redirectUrlService.Register(oldRoute.Value.OldRoute, oldRoute.Value.ContentKey, culture); } } From 993c582bd910c31af7ea913e6e4b1d94d825786d Mon Sep 17 00:00:00 2001 From: nikolajlauridsen Date: Tue, 1 Mar 2022 13:51:21 +0100 Subject: [PATCH 2/4] Handle empty string as invariant when generating cache key --- .../Routing/RedirectTrackingHandler.cs | 8 +++----- src/Umbraco.PublishedCache.NuCache/CacheKeys.cs | 4 +--- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs index f7c4a8ef0a..556c548cae 100644 --- a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs +++ b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs @@ -118,8 +118,7 @@ namespace Umbraco.Cms.Core.Routing foreach (var culture in cultures) { - var checkedCulture = string.IsNullOrEmpty(culture) ? null : culture; - var route = contentCache.GetRouteById(publishedContent.Id, checkedCulture); + var route = contentCache.GetRouteById(publishedContent.Id, culture); if (IsNotRoute(route)) { continue; @@ -147,14 +146,13 @@ namespace Umbraco.Cms.Core.Routing foreach (KeyValuePair oldRoute in oldRoutes) { - var culture = string.IsNullOrWhiteSpace(oldRoute.Key.Culture) ? null : oldRoute.Key.Culture; - var newRoute = contentCache.GetRouteById(oldRoute.Key.ContentId, culture); + var newRoute = contentCache.GetRouteById(oldRoute.Key.ContentId, oldRoute.Key.Culture); if (IsNotRoute(newRoute) || oldRoute.Value.OldRoute == newRoute) { continue; } - _redirectUrlService.Register(oldRoute.Value.OldRoute, oldRoute.Value.ContentKey, culture); + _redirectUrlService.Register(oldRoute.Value.OldRoute, oldRoute.Value.ContentKey, oldRoute.Key.Culture); } } diff --git a/src/Umbraco.PublishedCache.NuCache/CacheKeys.cs b/src/Umbraco.PublishedCache.NuCache/CacheKeys.cs index 3d8f14afd3..0ec6f0b7cb 100644 --- a/src/Umbraco.PublishedCache.NuCache/CacheKeys.cs +++ b/src/Umbraco.PublishedCache.NuCache/CacheKeys.cs @@ -13,9 +13,7 @@ namespace Umbraco.Cms.Infrastructure.PublishedCache [MethodImpl(MethodImplOptions.AggressiveInlining)] private static string LangId(string culture) - { - return culture != null ? ("-L:" + culture) : string.Empty; - } + => string.IsNullOrEmpty(culture) ? string.Empty : ("-L:" + culture); public static string PublishedContentChildren(Guid contentUid, bool previewing) { From 95f1ed33ecc6e3390303f9bfc9f237531baac1c3 Mon Sep 17 00:00:00 2001 From: nikolajlauridsen Date: Tue, 1 Mar 2022 14:14:48 +0100 Subject: [PATCH 3/4] Make empty string invariant culture in DefaultUrlProvider --- src/Umbraco.Core/Routing/DefaultUrlProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Core/Routing/DefaultUrlProvider.cs b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs index 5c27760b2a..eea53aaa9c 100644 --- a/src/Umbraco.Core/Routing/DefaultUrlProvider.cs +++ b/src/Umbraco.Core/Routing/DefaultUrlProvider.cs @@ -159,7 +159,7 @@ namespace Umbraco.Cms.Core.Routing : DomainUtilities.DomainForNode(umbracoContext.PublishedSnapshot.Domains, _siteDomainMapper, int.Parse(route.Substring(0, pos), CultureInfo.InvariantCulture), current, culture); var defaultCulture = _localizationService.GetDefaultLanguageIsoCode(); - if (domainUri is not null || culture is null || culture.Equals(defaultCulture, StringComparison.InvariantCultureIgnoreCase)) + if (domainUri is not null || string.IsNullOrEmpty(culture) || culture.Equals(defaultCulture, StringComparison.InvariantCultureIgnoreCase)) { var url = AssembleUrl(domainUri, path, current, mode).ToString(); return UrlInfo.Url(url, culture); From ff477c3930d1ab638d5d4831f24b6522517ea956 Mon Sep 17 00:00:00 2001 From: Mole Date: Wed, 2 Mar 2022 10:26:23 +0100 Subject: [PATCH 4/4] Update src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com> --- src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs index 556c548cae..2ef2034d3d 100644 --- a/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs +++ b/src/Umbraco.Infrastructure/Routing/RedirectTrackingHandler.cs @@ -102,7 +102,7 @@ namespace Umbraco.Cms.Core.Routing IPublishedContentCache contentCache = publishedSnapshot.Content; IPublishedContent entityContent = contentCache?.GetById(entity.Id); - if (entityContent == null) + if (entityContent is null) { return; }