Beispiel #1
0
        public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings)
        {
            var user = htmlHelper.ViewContext?.HttpContext?.User;

            if (cacheableSettings.Parameters.TryGetValue(SupportedVaryBy, out string value) && user != null)
            {
                var parameters = value.Split(',').Select(p => p.Trim());
                if (parameters.FirstOrDefault() == "*")
                {
                    return(string.Join(",", GetActiveRoles(VisitorGroupRepository.List().Select(vg => vg.Name))));
                }

                return(string.Join(",", GetActiveRoles(parameters)));
            }

            return(string.Empty);

            IEnumerable <string> GetActiveRoles(IEnumerable <string> roles)
            {
                foreach (var role in roles.Where(r => VisitorGroupService.IsUserInVisitorGroup(user, r, htmlHelper.ViewContext.HttpContext)))
                {
                    yield return(role);
                }
            }
        }
Beispiel #2
0
        public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings)
        {
            var query = htmlHelper.ViewContext?.HttpContext?.Request?.QueryString;

            if (cacheableSettings.Parameters.TryGetValue(SupportedVaryBy, out string value) && query != null)
            {
                var parameters = value.Split(',').Select(p => p.Trim());
                if (parameters.FirstOrDefault() == "*")
                {
                    return(string.Join(",", GetQueryParameters(query.AllKeys)));
                }

                return(string.Join(",", GetQueryParameters(parameters)));
            }

            return(string.Empty);

            IEnumerable <string> GetQueryParameters(IEnumerable <string> keys)
            {
                foreach (var key in keys)
                {
                    yield return($"{key}:{query.Get(key)}");
                }
            }
        }
Beispiel #3
0
        public string GenerateCacheKey(ICacheableSettings cacheableSettings, HtmlHelper helper, IContent content)
        {
            return(string.Join("&", CreateKeyFragments()));

            IEnumerable <string> CreateKeyFragments()
            {
                yield return("rootKey=" + ContentCacheKeyCreator.CreateLanguageCacheKey(content.ContentLink, (content as ILocalizable)?.Language.Name));

                foreach (string varyBy in cacheableSettings.VaryBy.OrderBy(v => v, StringComparer.OrdinalIgnoreCase))
                {
                    if (_keyFragmentFactories.TryGetValue(varyBy, out var factory))
                    {
                        yield return(factory.SupportedVaryBy + "=" + factory.CreateKeyFragment(helper, content, cacheableSettings));
                    }
                }
            }
        }
Beispiel #4
0
        public void CreateKeyFragment_GenerateKeyFragmentFromAllVisitorGroup_ReturnStringWithAllVisitorGroupValue(IContent content, ICacheableSettings cacheableSettings, IViewDataContainer viewDataContainer, [Frozen] IVisitorGroupService visitorGroupService, [Frozen] IVisitorGroupRepository visitorGroupRepository, [Frozen] IEnumerable <VisitorGroup> visitorGroups, VisitorGroupKeyFragmentFactory visitorGroupKeyFragmentFactory)
        {
            var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer);

            A.CallTo(() => visitorGroupRepository.List()).Returns(visitorGroups);
            A.CallTo(visitorGroupService)
            .Where(call => call.Method.Name == "IsUserInVisitorGroup" && visitorGroups.Any(vg => vg.Name == (call.Arguments.ElementAtOrDefault(1) as string)))
            .WithReturnType <bool>()
            .Returns(true);

            A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.VisitorGroups });
            A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> {
                { VaryBy.VisitorGroups, "*" }
            });

            string expectedResult = string.Join(",", visitorGroups.Select(vg => vg.Name));

            visitorGroupKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(expectedResult, "Because the returned value should be the all the visitor groups role names");
        }
Beispiel #5
0
 public void CreateKeyFragment_GenerateKeyFragmentFromSpecificQueryParameter_ReturnStringWithQueryParameterValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <(string name, string value)> queryParameters, IViewDataContainer viewDataContainer)
Beispiel #6
0
 public bool TryGetSettingsFromContentData(IContentData contentData, out ICacheableSettings cacheableSettings)
 {
     if (contentData is ICacheableSettings settings && settings.IsCacheSettingEnabled)
     {
         cacheableSettings = settings;
     }
Beispiel #7
0
        public void CreateKeyFragment_GenerateKeyFragmentFromUrl_ReturnStringWithUrlValue(IContent content, ICacheableSettings cacheableSettings, Uri url, IViewDataContainer viewDataContainer)
        {
            var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer);

            A.CallTo(() => htmlHelper.ViewContext.HttpContext.Request.Url).Returns(url);
            A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Url });

            var urlKeyFragmentFactory = new UrlKeyFragmentFactory();

            urlKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(url.AbsoluteUri, "Because the returned value should be the absolute url");
        }
Beispiel #8
0
 public string CreateKeyFragment(HtmlHelper htmlHelper, IContent content, ICacheableSettings cacheableSettings)
 {
     return(htmlHelper.ViewContext?.HttpContext?.Request?.Url.AbsoluteUri);
 }
Beispiel #9
0
        public void CreateKeyFragment_GenerateKeyFragmentFromAllCookie_ReturnStringWithCookieValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <HttpCookie> cookies, IViewDataContainer viewDataContainer)
        {
            var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer);

            htmlHelper.AddCookies(cookies);
            A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Cookies });
            A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> {
                { VaryBy.Cookies, "*" }
            });

            var cookieKeyFragmentFactory = new CookieKeyFragmentFactory();
            var expectedResult           = string.Join(",", cookies.Select(cookie => $"{cookie.Name}:{cookie.Value}"));

            cookieKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be(expectedResult, "Because the returned value should contain all the cookies names and values");
        }
Beispiel #10
0
        public void CreateKeyFragment_GenerateKeyFragmentFromSpecificCookie_ReturnStringWithCookieValue(IContent content, ICacheableSettings cacheableSettings, IEnumerable <HttpCookie> cookies, HttpCookie varyByCookie, IViewDataContainer viewDataContainer)
        {
            var htmlHelper = new HtmlHelper(A.Fake <ViewContext>(), viewDataContainer);

            htmlHelper.AddCookies(cookies, varyByCookie);
            A.CallTo(() => cacheableSettings.VaryBy).Returns(new[] { VaryBy.Cookies });
            A.CallTo(() => cacheableSettings.Parameters).Returns(new Dictionary <string, string> {
                { VaryBy.Cookies, varyByCookie.Name }
            });

            var cookieKeyFragmentFactory = new CookieKeyFragmentFactory();

            cookieKeyFragmentFactory.CreateKeyFragment(htmlHelper, content, cacheableSettings).Should().Be($"{varyByCookie.Name}:{varyByCookie.Value}", "Because the returned value should be the cookie name and value");
        }
Beispiel #11
0
        /// <summary>
        /// Renders from the cache or adds the result to the cache.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="partialRequest">The partial request.</param>
        /// <param name="content">The content.</param>
        /// <param name="templateModel">The template model.</param>
        /// <param name="settings">The settings.</param>
        protected virtual void RenderFromOrAddToCache(HtmlHelper helper, PartialRequest partialRequest, IContent content, TemplateModel templateModel, ICacheableSettings settings)
        {
            string cacheKey = KeyCreator.GenerateCacheKey(settings, helper, content);

            if (Cache.TryGet(cacheKey, ReadStrategy.Immediate, out string cachedHtml))
            {
                helper.ViewContext.Writer.Write(cachedHtml);
            }
            else
            {
                RenderAndAddToCache(helper, partialRequest, content, templateModel, settings, cacheKey);
            }
        }
Beispiel #12
0
        /// <summary>
        /// Render the html and adds it to the cache.
        /// </summary>
        /// <param name="helper">The helper.</param>
        /// <param name="partialRequest">The partial request.</param>
        /// <param name="content">The content.</param>
        /// <param name="templateModel">The template model.</param>
        /// <param name="settings">The settings.</param>
        /// <param name="cacheKey">The cache key.</param>
        protected virtual void RenderAndAddToCache(HtmlHelper helper, PartialRequest partialRequest, IContent content, TemplateModel templateModel, ICacheableSettings settings, string cacheKey)
        {
            using (var cacheWriter = new StringWriter())
            {
                var currentWriter = helper.ViewContext.Writer;
                helper.ViewContext.Writer = cacheWriter;
                DefaultRenderer.Render(helper, partialRequest, content, templateModel);
                var html = cacheWriter.ToString();
                currentWriter.Write(html);
                helper.ViewContext.Writer = currentWriter;

                if (helper.ViewContext.HttpContext.Error == null)
                {
                    InsertToCache(html);
                }
            }

            void InsertToCache(string html)
            {
                if (settings.MaxTimeInCache == TimeSpan.Zero)
                {
                    Cache.Insert(cacheKey, html, new CacheEvictionPolicy(null, MasterCacheKeys));
                }
                else
                {
                    Cache.Insert(cacheKey, html, new CacheEvictionPolicy(settings.MaxTimeInCache, CacheTimeoutType.Absolute, null, MasterCacheKeys));
                }
            }
        }