示例#1
0
        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);
        }
示例#4
0
    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));
    }
示例#5
0
    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);
        }
示例#9
0
        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);
        }
示例#10
0
        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
        }
示例#11
0
 public AliasUrlProvider(IOptions <RequestHandlerSettings> requestConfig, ISiteDomainMapper siteDomainMapper, UriUtility uriUtility, IPublishedValueFallback publishedValueFallback, IUmbracoContextAccessor umbracoContextAccessor)
 {
     _requestConfig          = requestConfig.Value;
     _siteDomainMapper       = siteDomainMapper;
     _uriUtility             = uriUtility;
     _publishedValueFallback = publishedValueFallback;
     _umbracoContextAccessor = umbracoContextAccessor;
 }
示例#12
0
 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")));
        }
示例#15
0
        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);
        }
示例#19
0
        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();
示例#20
0
        // 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));
        }
示例#21
0
        /// <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));
        }
示例#24
0
        /// <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;
        }
示例#25
0
    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);
    }
示例#26
0
    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());
    }
示例#27
0
        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);
        }
示例#30
0
        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));
        }