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
This commit is contained in:
matteo.piovanelli 2016-10-17 12:54:53 +02:00
parent bd222908d6
commit c9e14f9b82
6 changed files with 23 additions and 1 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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<string>() : new HashSet<string>(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<string>() : new HashSet<string>(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<string> VaryByQueryStringParameters { get; private set; }
public ISet<string> VaryByRequestHeaders { get; private set; }
public ISet<string> VaryByRequestCookies { get; private set; }
public IEnumerable<string> IgnoredUrls { get; private set; }
public bool IgnoreNoCache { get; private set; }
public bool VaryByCulture { get; private set; }

View File

@ -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); }

View File

@ -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; }

View File

@ -43,7 +43,13 @@
@Html.TextBoxFor(m => m.VaryByRequestHeaders, new { @class = "text medium" })
<span class="hint">@T("When defined, using comma separated values, sets caching to vary by the specified request headers.")</span>
</fieldset>
<fieldset>
<label>@T("Vary Cookie String Parameters")</label>
@Html.TextBoxFor(m => m.VaryByRequestCookies, new { @class = "text medium" })
<span class="hint">@T("When defined, using comma separated values, sets caching to vary via specified cookie string parameters")</span>
</fieldset>
<fieldset>
<label>@T("Ignored URLs")</label>
@Html.TextAreaFor(m => m.IgnoredUrls, new { @class = "text medium" })