public void Get_Url_For_Culture_Variant_With_Current_Url() { const string currentUri = "http://example.fr/test"; var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var contentType = new PublishedContentType(Guid.NewGuid(), 666, "alias", PublishedItemType.Content, Enumerable.Empty <string>(), Enumerable.Empty <PublishedPropertyType>(), ContentVariation.Culture); var publishedContent = new SolidPublishedContent(contentType) { Id = 1234 }; var publishedContentCache = new Mock <IPublishedContentCache>(); publishedContentCache.Setup(x => x.GetRouteById(1234, "fr-FR")) .Returns("9876/home/test-fr"); //prefix with the root id node with the domain assigned as per the umbraco standard publishedContentCache.Setup(x => x.GetById(It.IsAny <int>())) .Returns <int>(id => id == 1234 ? publishedContent : null); var domainCache = new Mock <IDomainCache>(); domainCache.Setup(x => x.GetAssigned(It.IsAny <int>(), false)) .Returns((int contentId, bool includeWildcards) => { if (contentId != 9876) { return(Enumerable.Empty <Domain>()); } return(new[] { new Domain(2, "example.us", 9876, "en-US", false), //default new Domain(3, "example.fr", 9876, "fr-FR", false) }); }); domainCache.Setup(x => x.DefaultCulture).Returns(CultureInfo.GetCultureInfo("en-US").Name); var snapshot = Mock.Of <IPublishedSnapshot>(x => x.Content == publishedContentCache.Object && x.Domains == domainCache.Object); var snapshotService = new Mock <IPublishedSnapshotService>(); snapshotService.Setup(x => x.CreatePublishedSnapshot(It.IsAny <string>())) .Returns(snapshot); var umbracoContext = GetUmbracoContext(currentUri, globalSettings: _globalSettings, snapshotService: snapshotService.Object); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); var url = publishedUrlProvider.GetUrl(1234, culture: "fr-FR"); Assert.AreEqual("/home/test-fr/", url); }
public void Get_Url_Alternate() { SetDomains5(); var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; GlobalSettings.HideTopLevelNodeFromPath = false; var umbracoContextAccessor = GetUmbracoContextAccessor("http://domain1.com/en/test"); UrlProvider urlProvider = GetUrlProvider(umbracoContextAccessor, requestHandlerSettings, new WebRoutingSettings(), out UriUtility uriUtility); var url = urlProvider.GetUrl(100111, UrlMode.Absolute); Assert.AreEqual("http://domain1.com/en/1001-1-1/", url); var result = urlProvider.GetOtherUrls(100111).ToArray(); foreach (var x in result) { Console.WriteLine(x); } Assert.AreEqual(2, result.Length); Assert.AreEqual(result[0].Text, "http://domain1b.com/en/1001-1-1/"); Assert.AreEqual(result[1].Text, "http://domain1a.com/en/1001-1-1/"); }
public void U4_4056() { var requestHandlerSettings = new RequestHandlerSettings() { CharCollection = Enumerable.Empty <IChar>(), ConvertUrlsToAscii = "false" }; const string input = "ÆØÅ and æøå and 中文测试 and אודות האתר and größer БбДдЖж page"; var helper = new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(requestHandlerSettings)); // unicode var output = helper.CleanStringForUrlSegment(input); Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", output); helper = new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(requestHandlerSettings) .WithConfig(CleanStringType.UrlSegment, new DefaultShortStringHelperConfig.Config { IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', StringType = CleanStringType.LowerCase | CleanStringType.Ascii, // ascii Separator = '-' })); output = helper.CleanStringForUrlSegment(input); Assert.AreEqual("aeoa-and-aeoa-and-and-and-grosser-bbddzhzh-page", output); }
public void U4_4056_TryAscii() { var requestHandlerSettings = new RequestHandlerSettings { CharCollection = Array.Empty <CharItem>(), EnableDefaultCharReplacements = false, ConvertUrlsToAscii = "false", }; const string input1 = "ÆØÅ and æøå and 中文测试 and אודות האתר and größer БбДдЖж page"; const string input2 = "ÆØÅ and æøå and größer БбДдЖж page"; var helper = new DefaultShortStringHelper( new DefaultShortStringHelperConfig().WithDefault(requestHandlerSettings)); // unicode Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1)); Assert.AreEqual("æøå-and-æøå-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input2)); helper = new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(requestHandlerSettings) .WithConfig(CleanStringType.UrlSegment, new DefaultShortStringHelperConfig.Config { IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', StringType = CleanStringType.LowerCase | CleanStringType.TryAscii, // try ascii Separator = '-', })); Assert.AreEqual("æøå-and-æøå-and-中文测试-and-אודות-האתר-and-größer-ббдджж-page", helper.CleanStringForUrlSegment(input1)); Assert.AreEqual("aeoa-and-aeoa-and-grosser-bbddzhzh-page", helper.CleanStringForUrlSegment(input2)); }
public void CleanStringDefaultConfig() { var requestHandlerSettings = new RequestHandlerSettings { CharCollection = Array.Empty <CharItem>(), EnableDefaultCharReplacements = false, ConvertUrlsToAscii = "false", }; var helper = new DefaultShortStringHelper(new DefaultShortStringHelperConfig().WithDefault(requestHandlerSettings)); const string input = "0123 中文测试 中文测试 léger ZÔRG (2) a?? *x"; var alias = helper.CleanStringForSafeAlias(input); var filename = helper.CleanStringForSafeFileName(input); var segment = helper.CleanStringForUrlSegment(input); // umbraco-cased ascii alias, must begin with a proper letter Assert.AreEqual("legerZORG2AX", alias, "alias"); // lower-cased, utf8 filename, removing illegal filename chars, using dash-separator Assert.AreEqual("0123-中文测试-中文测试-léger-zôrg-2-a-x", filename, "filename"); // lower-cased, utf8 URL segment, only letters and digits, using dash-separator Assert.AreEqual("0123-中文测试-中文测试-léger-zôrg-2-a-x", segment, "segment"); }
public void Get_Url_Alternate() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var globalSettings = new GlobalSettings { HideTopLevelNodeFromPath = false }; var umbracoContext = GetUmbracoContext("http://domain1.com/en/test", 1111, globalSettings: globalSettings); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains5(); var url = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute); Assert.AreEqual("http://domain1.com/en/1001-1-1/", url); var result = publishedUrlProvider.GetOtherUrls(100111).ToArray(); foreach (var x in result) { Console.WriteLine(x); } Assert.AreEqual(2, result.Length); Assert.AreEqual(result[0].Text, "http://domain1b.com/en/1001-1-1/"); Assert.AreEqual(result[1].Text, "http://domain1a.com/en/1001-1-1/"); }
public void Get_Url_Relative_Or_Absolute() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var globalSettings = new GlobalSettings { HideTopLevelNodeFromPath = false }; var umbracoContext = GetUmbracoContext("http://domain1.com/test", 1111, globalSettings: globalSettings); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains4(); Assert.AreEqual("/en/1001-1-1/", publishedUrlProvider.GetUrl(100111)); Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311)); publishedUrlProvider.Mode = UrlMode.Absolute; Assert.AreEqual("http://domain1.com/en/1001-1-1/", publishedUrlProvider.GetUrl(100111)); Assert.AreEqual("http://domain3.com/en/1003-1-1/", publishedUrlProvider.GetUrl(100311)); }
public void Get_Url_NestedDomains(int nodeId, string currentUrl, bool absolute, string expected) { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var globalSettings = new GlobalSettings { HideTopLevelNodeFromPath = false }; var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: globalSettings); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); SetDomains4(); var currentUri = new Uri(currentUrl); var mode = absolute ? UrlMode.Absolute : UrlMode.Auto; var result = publishedUrlProvider.GetUrl(nodeId, mode, current: currentUri); Assert.AreEqual(expected, result); }
public void Ensure_Cache_Is_Correct() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = false }; var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: _globalSettings); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); var samples = new Dictionary <int, string> { { 1046, "/home" }, { 1173, "/home/sub1" }, { 1174, "/home/sub1/sub2" }, { 1176, "/home/sub1/sub-3" }, { 1177, "/home/sub1/custom-sub-1" }, { 1178, "/home/sub1/custom-sub-2" }, { 1175, "/home/sub-2" }, { 1172, "/test-page" } }; foreach (var sample in samples) { var result = publishedUrlProvider.GetUrl(sample.Key); Assert.AreEqual(sample.Value, result); } var randomSample = new KeyValuePair <int, string>(1177, "/home/sub1/custom-sub-1"); for (int i = 0; i < 5; i++) { var result = publishedUrlProvider.GetUrl(randomSample.Key); Assert.AreEqual(randomSample.Value, result); } var cache = umbracoContext.Content as PublishedContentCache; if (cache == null) { throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported."); } var cachedRoutes = cache.RoutesCache.GetCachedRoutes(); Assert.AreEqual(8, cachedRoutes.Count); foreach (var sample in samples) { Assert.IsTrue(cachedRoutes.ContainsKey(sample.Key)); Assert.AreEqual(sample.Value, cachedRoutes[sample.Key]); } var cachedIds = cache.RoutesCache.GetCachedIds(); Assert.AreEqual(0, cachedIds.Count); }
public async Task DoNotPolluteCache() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; GlobalSettings.HideTopLevelNodeFromPath = false; SetDomains1(); const string url = "http://domain1.com/1001-1/1001-1-1"; // get the nice URL for 100111 var umbracoContextAccessor = GetUmbracoContextAccessor(url); var umbracoContext = umbracoContextAccessor.GetRequiredUmbracoContext(); var urlProvider = new DefaultUrlProvider( Mock.Of <IOptionsMonitor <RequestHandlerSettings> >(x => x.CurrentValue == requestHandlerSettings), Mock.Of <ILogger <DefaultUrlProvider> >(), new SiteDomainMapper(), umbracoContextAccessor, new UriUtility(Mock.Of <IHostingEnvironment>()), Mock.Of <ILocalizationService>()); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); string absUrl = publishedUrlProvider.GetUrl(100111, UrlMode.Absolute); Assert.AreEqual("http://domain2.com/1001-1-1/", absUrl); const string cacheKeyPrefix = "NuCache.ContentCache.RouteByContent"; // check that the proper route has been cached var cache = (FastDictionaryAppCache)umbracoContext.PublishedSnapshot.ElementsCache; var cachedRoutes = cache.Keys.Where(x => x.StartsWith(cacheKeyPrefix)).ToList(); var cacheKey = $"{cacheKeyPrefix}[P:100111]"; Assert.AreEqual("10011/1001-1-1", cache.Get(cacheKey)); // route a rogue URL var publishedRouter = CreatePublishedRouter(umbracoContextAccessor); var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl); publishedRouter.FindDomain(frequest); Assert.IsTrue(frequest.HasDomain()); // check that it's been routed var lookup = new ContentFinderByUrl(Mock.Of <ILogger <ContentFinderByUrl> >(), umbracoContextAccessor); var result = await lookup.TryFindContent(frequest); Assert.IsTrue(result); Assert.AreEqual(100111, frequest.PublishedContent.Id); // has the cache been polluted? cachedRoutes = cache.Keys.Where(x => x.StartsWith(cacheKeyPrefix)).ToList(); Assert.AreEqual("10011/1001-1-1", cache.Get(cacheKey)); // no // what's the nice URL now? Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good }
public AliasUrlProvider(IOptions <RequestHandlerSettings> requestConfig, ISiteDomainMapper siteDomainMapper, UriUtility uriUtility, IPublishedValueFallback publishedValueFallback, IUmbracoContextAccessor umbracoContextAccessor) { _requestConfig = requestConfig.Value; _siteDomainMapper = siteDomainMapper; _uriUtility = uriUtility; _publishedValueFallback = publishedValueFallback; _umbracoContextAccessor = umbracoContextAccessor; }
public DefaultUrlProvider(IOptions <RequestHandlerSettings> requestSettings, ILogger <DefaultUrlProvider> logger, ISiteDomainMapper siteDomainMapper, IUmbracoContextAccessor umbracoContextAccessor, UriUtility uriUtility) { _requestSettings = requestSettings.Value; _logger = logger; _siteDomainMapper = siteDomainMapper; _uriUtility = uriUtility; _umbracoContextAccessor = umbracoContextAccessor; }
public void Returns_Success_ForValid_Configuration() { var validator = new RequestHandlerSettingsValidator(); var options = new RequestHandlerSettings(); ValidateOptionsResult result = validator.Validate("settings", options); Assert.True(result.Succeeded); }
public void Get_Url_DomainsAndCache() { SetDomains4(); var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; GlobalSettings.HideTopLevelNodeFromPath = false; var umbracoContextAccessor = GetUmbracoContextAccessor("/test"); var umbracoContext = umbracoContextAccessor.GetRequiredUmbracoContext(); UrlProvider urlProvider = GetUrlProvider(umbracoContextAccessor, requestHandlerSettings, new WebRoutingSettings(), out UriUtility uriUtility); string ignore; ignore = urlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com")); ignore = urlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain2.com")); ignore = urlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain2.com")); ignore = urlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain2.com")); ignore = urlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain2.com")); var cache = (FastDictionaryAppCache)umbracoContext.PublishedSnapshot.ElementsCache; var cachedRoutes = cache.Keys.Where(x => x.StartsWith(CacheKeyPrefix)).ToList(); Assert.AreEqual(7, cachedRoutes.Count); //var cachedIds = cache.RoutesCache.GetCachedIds(); //Assert.AreEqual(0, cachedIds.Count); CheckRoute(cache, 1001, "1001/"); CheckRoute(cache, 10011, "10011/"); CheckRoute(cache, 100111, "10011/1001-1-1"); CheckRoute(cache, 10012, "10012/"); CheckRoute(cache, 100121, "10012/1001-2-1"); CheckRoute(cache, 10013, "1001/1001-3"); CheckRoute(cache, 1002, "/1002"); // use the cache Assert.AreEqual("/", urlProvider.GetUrl(1001, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/en/", urlProvider.GetUrl(10011, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/en/1001-1-1/", urlProvider.GetUrl(100111, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/fr/", urlProvider.GetUrl(10012, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/fr/1001-2-1/", urlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/1001-3/", urlProvider.GetUrl(10013, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("/1002/", urlProvider.GetUrl(1002, UrlMode.Auto, current: new Uri("http://domain1.com"))); Assert.AreEqual("http://domain1.com/fr/1001-2-1/", urlProvider.GetUrl(100121, UrlMode.Auto, current: new Uri("http://domain2.com"))); }
public async Task DoNotPolluteCache() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var globalSettings = new GlobalSettings { HideTopLevelNodeFromPath = false }; SetDomains1(); const string url = "http://domain1.com/1001-1/1001-1-1"; // get the nice URL for 100111 var umbracoContext = GetUmbracoContext(url, 9999, globalSettings: globalSettings); var umbracoContextAccessor = GetUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111, UrlMode.Absolute)); // check that the proper route has been cached var cache = umbracoContext.Content as PublishedContentCache; if (cache == null) { throw new Exception("Unsupported IPublishedContentCache, only the Xml one is supported."); } var cachedRoutes = cache.RoutesCache.GetCachedRoutes(); Assert.AreEqual("10011/1001-1-1", cachedRoutes[100111]); // route a rogue URL var publishedRouter = CreatePublishedRouter(umbracoContextAccessor); var frequest = await publishedRouter.CreateRequestAsync(umbracoContext.CleanedUmbracoUrl); publishedRouter.FindDomain(frequest); Assert.IsTrue(frequest.HasDomain()); // check that it's been routed var lookup = new ContentFinderByUrl(LoggerFactory.CreateLogger <ContentFinderByUrl>(), GetUmbracoContextAccessor(umbracoContext)); var result = lookup.TryFindContent(frequest); Assert.IsTrue(result); Assert.AreEqual(100111, frequest.PublishedContent.Id); // has the cache been polluted? cachedRoutes = cache.RoutesCache.GetCachedRoutes(); Assert.AreEqual("10011/1001-1-1", cachedRoutes[100111]); // no //Assert.AreEqual("1001/1001-1/1001-1-1", cachedRoutes[100111]); // yes // what's the nice URL now? Assert.AreEqual("http://domain2.com/1001-1-1/", publishedUrlProvider.GetUrl(100111)); // good //Assert.AreEqual("http://domain1.com/1001-1/1001-1-1", routingContext.NiceUrlProvider.GetNiceUrl(100111, true)); // bad }
/// <summary> /// Sets the default configuration. /// </summary> /// <returns>The short string helper.</returns> public DefaultShortStringHelperConfig WithDefault(RequestHandlerSettings requestHandlerSettings) { IEnumerable <IChar> charCollection = requestHandlerSettings.GetCharReplacements(); UrlReplaceCharacters = charCollection .Where(x => string.IsNullOrEmpty(x.Char) == false) .ToDictionary(x => x.Char, x => x.Replacement); var urlSegmentConvertTo = CleanStringType.Utf8; if (requestHandlerSettings.ShouldConvertUrlsToAscii) { urlSegmentConvertTo = CleanStringType.Ascii; } if (requestHandlerSettings.ShouldTryConvertUrlsToAscii) { urlSegmentConvertTo = CleanStringType.TryAscii; } return(WithConfig(CleanStringType.UrlSegment, new Config { PreFilter = ApplyUrlReplaceCharacters, PostFilter = x => CutMaxLength(x, 240), IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore StringType = urlSegmentConvertTo | CleanStringType.LowerCase, BreakTermsOnUpper = false, Separator = '-' }).WithConfig(CleanStringType.FileName, new Config { PreFilter = ApplyUrlReplaceCharacters, IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore StringType = CleanStringType.Utf8 | CleanStringType.LowerCase, BreakTermsOnUpper = false, Separator = '-' }).WithConfig(CleanStringType.Alias, new Config { PreFilter = ApplyUrlReplaceCharacters, IsTerm = (c, leading) => leading ? char.IsLetter(c) // only letters : (char.IsLetterOrDigit(c) || c == '_'), // letter, digit or underscore StringType = CleanStringType.Ascii | CleanStringType.UmbracoCase, BreakTermsOnUpper = false }).WithConfig(CleanStringType.UnderscoreAlias, new Config { PreFilter = ApplyUrlReplaceCharacters, IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore StringType = CleanStringType.Ascii | CleanStringType.UmbracoCase, BreakTermsOnUpper = false }).WithConfig(CleanStringType.ConvertCase, new Config { PreFilter = null, IsTerm = (c, leading) => char.IsLetterOrDigit(c) || c == '_', // letter, digit or underscore StringType = CleanStringType.Ascii, BreakTermsOnUpper = true })); }
public override void SetUp() { base.SetUp(); _globalSettings = new GlobalSettings(); _webRoutingSettings = new WebRoutingSettings(); _requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; }
public void Returns_Fail_For_Configuration_With_Invalid_ConvertUrlsToAscii_Field() { var validator = new RequestHandlerSettingsValidator(); var options = new RequestHandlerSettings { ConvertUrlsToAscii = "invalid" }; ValidateOptionsResult result = validator.Validate("settings", options); Assert.False(result.Succeeded); }
public void Ensure_Cache_Is_Correct() { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = false }; string xml = PublishedContentXml.BaseWebTestXml(1234); IEnumerable <ContentNodeKit> kits = PublishedContentXmlAdapter.GetContentNodeKits( xml, TestHelper.ShortStringHelper, out ContentType[] contentTypes, out DataType[] dataTypes).ToList();
// maps an internal umbraco uri to a public uri // ie with virtual directory, .aspx if required... public Uri UriFromUmbraco(Uri uri, RequestHandlerSettings requestConfig) { var path = uri.GetSafeAbsolutePath(); if (path != "/" && requestConfig.AddTrailingSlash) { path = path.EnsureEndsWith("/"); } path = ToAbsolute(path); return(uri.Rewrite(path)); }
/// <summary> /// Get concatenated user and default character replacements /// taking into account <see cref="RequestHandlerSettings.EnableDefaultCharReplacements"/> /// </summary> public static IEnumerable <CharItem> GetCharReplacements(this RequestHandlerSettings requestHandlerSettings) { if (requestHandlerSettings.EnableDefaultCharReplacements is false) { return(requestHandlerSettings.UserDefinedCharCollection ?? Enumerable.Empty <CharItem>()); } if (requestHandlerSettings.UserDefinedCharCollection == null || requestHandlerSettings.UserDefinedCharCollection.Any() is false) { return(RequestHandlerSettings.DefaultCharCollection); } return(MergeUnique(requestHandlerSettings.UserDefinedCharCollection, RequestHandlerSettings.DefaultCharCollection)); }
[TestCase(1172, "/test-page/")] // not hidden because not first root public void Get_Url_Hiding_Top_Level(int nodeId, string niceUrlMatch) { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var umbracoContextAccessor = GetUmbracoContextAccessor("/test"); var urlProvider = GetUrlProvider(umbracoContextAccessor, requestHandlerSettings, new WebRoutingSettings(), out var uriUtility); var result = urlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); }
public void Given_CharCollection_With_DefaultDisabled_ReturnsUserCollection() { var userCollection = new CharItem[] { new () { Char = "test", Replacement = "replace" }, new () { Char = "test2", Replacement = "replace2" } }; var settings = new RequestHandlerSettings { UserDefinedCharCollection = userCollection, EnableDefaultCharReplacements = false }; var actual = settings.GetCharReplacements().ToList(); Assert.AreEqual(userCollection.Length, actual.Count); Assert.That(actual, Is.EquivalentTo(userCollection)); }
/// <summary> /// Merges CharCollection and UserDefinedCharCollection, prioritizing UserDefinedCharCollection /// </summary> internal static void MergeReplacements(this RequestHandlerSettings requestHandlerSettings, IConfiguration configuration) { string sectionKey = $"{Constants.Configuration.ConfigRequestHandler}:"; IEnumerable <CharItem> charCollection = GetReplacements( configuration, $"{sectionKey}{nameof(RequestHandlerSettings.CharCollection)}"); IEnumerable <CharItem> userDefinedCharCollection = GetReplacements( configuration, $"{sectionKey}{nameof(requestHandlerSettings.UserDefinedCharCollection)}"); IEnumerable <CharItem> mergedCollection = MergeUnique(userDefinedCharCollection, charCollection); requestHandlerSettings.UserDefinedCharCollection = mergedCollection; }
public DefaultUrlProvider( IOptionsMonitor <RequestHandlerSettings> requestSettings, ILogger <DefaultUrlProvider> logger, ISiteDomainMapper siteDomainMapper, IUmbracoContextAccessor umbracoContextAccessor, UriUtility uriUtility, ILocalizationService localizationService) { _requestSettings = requestSettings.CurrentValue; _logger = logger; _siteDomainMapper = siteDomainMapper; _umbracoContextAccessor = umbracoContextAccessor; _uriUtility = uriUtility; _localizationService = localizationService; requestSettings.OnChange(x => _requestSettings = x); }
public void Uri_From_Umbraco(string sourceUrl, string expectedUrl, bool trailingSlash) { // Arrange var sourceUri = new Uri(sourceUrl, UriKind.Relative); var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = trailingSlash }; var uriUtility = BuildUriUtility("/"); // Act var resultUri = uriUtility.UriFromUmbraco(sourceUri, requestHandlerSettings); // Assert var expectedUri = new Uri(expectedUrl, UriKind.Relative); Assert.AreEqual(expectedUri.ToString(), resultUri.ToString()); }
protected virtual void ComposeSettings() { var contentSettings = new ContentSettings(); var coreDebugSettings = new CoreDebugSettings(); var globalSettings = new GlobalSettings(); var nuCacheSettings = new NuCacheSettings(); var requestHandlerSettings = new RequestHandlerSettings(); var userPasswordConfigurationSettings = new UserPasswordConfigurationSettings(); var webRoutingSettings = new WebRoutingSettings(); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(contentSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(coreDebugSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(globalSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(nuCacheSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(requestHandlerSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(userPasswordConfigurationSettings)); Builder.Services.AddTransient(x => Microsoft.Extensions.Options.Options.Create(webRoutingSettings)); }
public override void Setup() { base.Setup(); _webRoutingSettings = new WebRoutingSettings(); _requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; GlobalSettings.HideTopLevelNodeFromPath = false; string xml = PublishedContentXml.BaseWebTestXml(1234); IEnumerable <ContentNodeKit> kits = PublishedContentXmlAdapter.GetContentNodeKits( xml, TestHelper.ShortStringHelper, out ContentType[] contentTypes, out DataType[] dataTypes).ToList();
[TestCase(1172, "/test-page/")] // not hidden because not first root public void Get_Url_Hiding_Top_Level(int nodeId, string niceUrlMatch) { var requestHandlerSettings = new RequestHandlerSettings { AddTrailingSlash = true }; var umbracoContext = GetUmbracoContext("/test", 1111, globalSettings: _globalSettings, snapshotService: PublishedSnapshotService); var umbracoContextAccessor = new TestUmbracoContextAccessor(umbracoContext); var urlProvider = new DefaultUrlProvider( Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), umbracoContextAccessor, UriUtility); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); var result = publishedUrlProvider.GetUrl(nodeId); Assert.AreEqual(niceUrlMatch, result); }
public void Get_Url_Unpublished() { var requestHandlerSettings = new RequestHandlerSettings(); var urlProvider = new DefaultUrlProvider(Microsoft.Extensions.Options.Options.Create(requestHandlerSettings), LoggerFactory.CreateLogger <DefaultUrlProvider>(), new SiteDomainMapper(), UmbracoContextAccessor, UriUtility); var umbracoContext = GetUmbracoContext("http://example.com/test", 1111, globalSettings: _globalSettings); var publishedUrlProvider = GetPublishedUrlProvider(umbracoContext, urlProvider); //mock the Umbraco settings that we need Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999)); publishedUrlProvider.Mode = UrlMode.Absolute; Assert.AreEqual("#", publishedUrlProvider.GetUrl(999999)); }