From c9e14f9b82c05f96bb6cef494099103aacf7758b Mon Sep 17 00:00:00 2001 From: "matteo.piovanelli" Date: Mon, 17 Oct 2016 12:54:53 +0200 Subject: [PATCH] Modified the OutputCache Module based on the enhancement proposed in Issue 5811, by adding a VaryByRequestCookies property to the CacheSettingsPart to enable the generation of the Cache Key based on cookies --- .../Orchard.OutputCache/Controllers/AdminController.cs | 2 ++ .../Orchard.OutputCache/Filters/OutputCacheFilter.cs | 6 ++++++ .../Modules/Orchard.OutputCache/Models/CacheSettings.cs | 2 ++ .../Orchard.OutputCache/Models/CacheSettingsPart.cs | 5 +++++ .../Orchard.OutputCache/ViewModels/IndexViewModel.cs | 1 + .../Modules/Orchard.OutputCache/Views/Admin/Index.cshtml | 8 +++++++- 6 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs index f8a042706..a2798425d 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Controllers/AdminController.cs @@ -89,6 +89,7 @@ namespace Orchard.OutputCache.Controllers { DefaultMaxAge = settings.DefaultMaxAge, VaryByQueryStringParameters = settings.VaryByQueryStringParameters, VaryByRequestHeaders = settings.VaryByRequestHeaders, + VaryByRequestCookies = settings.VaryByRequestCookies, IgnoredUrls = settings.IgnoredUrls, IgnoreNoCache = settings.IgnoreNoCache, VaryByCulture = settings.VaryByCulture, @@ -116,6 +117,7 @@ namespace Orchard.OutputCache.Controllers { settings.DefaultMaxAge = model.DefaultMaxAge; settings.VaryByQueryStringParameters = model.VaryByQueryStringParameters; settings.VaryByRequestHeaders = model.VaryByRequestHeaders; + settings.VaryByRequestCookies = model.VaryByRequestCookies; settings.IgnoredUrls = model.IgnoredUrls; settings.IgnoreNoCache = model.IgnoreNoCache; settings.VaryByCulture = model.VaryByCulture; diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs index 548012e6b..4e0bc04a3 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Filters/OutputCacheFilter.cs @@ -397,6 +397,12 @@ namespace Orchard.OutputCache.Filters { result["HEADER:" + varyByRequestHeader] = requestHeaders[varyByRequestHeader]; } + // Vary by configured cookies. + var requestCookies = filterContext.RequestContext.HttpContext.Request.Cookies; + foreach (var varyByRequestCookies in CacheSettings.VaryByRequestCookies) { + if (requestCookies[varyByRequestCookies] != null) + result["COOKIE:" + varyByRequestCookies] = requestCookies[varyByRequestCookies].Value; + } // Vary by request culture if configured. if (CacheSettings.VaryByCulture) { diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs index 62075c24d..7797d7382 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettings.cs @@ -14,6 +14,7 @@ namespace Orchard.OutputCache.Models { VaryByQueryStringParameters = String.IsNullOrWhiteSpace(part.VaryByQueryStringParameters) ? null : part.VaryByQueryStringParameters.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(); VaryByRequestHeaders = String.IsNullOrWhiteSpace(part.VaryByRequestHeaders) ? new HashSet() : new HashSet(part.VaryByRequestHeaders.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); VaryByRequestHeaders.Add("HOST"); // Always vary by host name/tenant. + VaryByRequestCookies = String.IsNullOrWhiteSpace(part.VaryByRequestCookies) ? new HashSet() : new HashSet(part.VaryByRequestCookies.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray()); IgnoredUrls = String.IsNullOrWhiteSpace(part.IgnoredUrls) ? null : part.IgnoredUrls.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).ToArray(); IgnoreNoCache = part.IgnoreNoCache; VaryByCulture = part.VaryByCulture; @@ -27,6 +28,7 @@ namespace Orchard.OutputCache.Models { public int DefaultMaxAge { get; private set; } public IEnumerable VaryByQueryStringParameters { get; private set; } public ISet VaryByRequestHeaders { get; private set; } + public ISet VaryByRequestCookies { get; private set; } public IEnumerable IgnoredUrls { get; private set; } public bool IgnoreNoCache { get; private set; } public bool VaryByCulture { get; private set; } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs index b11eb3fae..69e8441fd 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Models/CacheSettingsPart.cs @@ -44,6 +44,11 @@ namespace Orchard.OutputCache.Models { } } + public string VaryByRequestCookies { + get { return this.Retrieve(x => x.VaryByRequestCookies); } + set { this.Store(x => x.VaryByRequestCookies, value); } + } + public string IgnoredUrls { get { return this.Retrieve(x => x.IgnoredUrls); } set { this.Store(x => x.IgnoredUrls, value); } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs b/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs index 1cda10ada..b79ff5509 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/ViewModels/IndexViewModel.cs @@ -11,6 +11,7 @@ namespace Orchard.OutputCache.ViewModels { [Range(0, Int32.MaxValue), Required] public int DefaultMaxAge { get; set; } public string VaryByQueryStringParameters { get; set; } public string VaryByRequestHeaders { get; set; } + public string VaryByRequestCookies { get; set; } public string IgnoredUrls { get; set; } public bool IgnoreNoCache { get; set; } public bool VaryByCulture { get; set; } diff --git a/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml b/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml index 960b43bb4..9750acb7e 100644 --- a/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml +++ b/src/Orchard.Web/Modules/Orchard.OutputCache/Views/Admin/Index.cshtml @@ -43,7 +43,13 @@ @Html.TextBoxFor(m => m.VaryByRequestHeaders, new { @class = "text medium" }) @T("When defined, using comma separated values, sets caching to vary by the specified request headers.") - + +
+ + @Html.TextBoxFor(m => m.VaryByRequestCookies, new { @class = "text medium" }) + @T("When defined, using comma separated values, sets caching to vary via specified cookie string parameters") +
+
@Html.TextAreaFor(m => m.IgnoredUrls, new { @class = "text medium" })