Split by commas when normalizing headers
This commit is contained in:
parent
6c13371fa0
commit
dd4799adfd
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
|
@ -211,7 +212,7 @@ namespace Microsoft.AspNetCore.ResponseCaching
|
||||||
|
|
||||||
// Create the cache entry now
|
// Create the cache entry now
|
||||||
var response = context.HttpContext.Response;
|
var response = context.HttpContext.Response;
|
||||||
var varyHeaderValue = response.Headers[HeaderNames.Vary];
|
var varyHeaderValue = new StringValues(response.Headers.GetCommaSeparatedValues(HeaderNames.Vary));
|
||||||
var varyParamsValue = context.HttpContext.GetResponseCacheFeature()?.VaryByParams ?? StringValues.Empty;
|
var varyParamsValue = context.HttpContext.GetResponseCacheFeature()?.VaryByParams ?? StringValues.Empty;
|
||||||
context.CachedResponseValidFor = context.ResponseCacheControlHeaderValue.SharedMaxAge ??
|
context.CachedResponseValidFor = context.ResponseCacheControlHeaderValue.SharedMaxAge ??
|
||||||
context.ResponseCacheControlHeaderValue.MaxAge ??
|
context.ResponseCacheControlHeaderValue.MaxAge ??
|
||||||
|
|
@ -222,8 +223,8 @@ namespace Microsoft.AspNetCore.ResponseCaching
|
||||||
if (!StringValues.IsNullOrEmpty(varyHeaderValue) || !StringValues.IsNullOrEmpty(varyParamsValue))
|
if (!StringValues.IsNullOrEmpty(varyHeaderValue) || !StringValues.IsNullOrEmpty(varyParamsValue))
|
||||||
{
|
{
|
||||||
// Normalize order and casing of vary by rules
|
// Normalize order and casing of vary by rules
|
||||||
var normalizedVaryHeaderValue = GetNormalizedStringValues(varyHeaderValue);
|
var normalizedVaryHeaderValue = GetOrderCasingNormalizedStringValues(varyHeaderValue);
|
||||||
var normalizedVaryParamsValue = GetNormalizedStringValues(varyParamsValue);
|
var normalizedVaryParamsValue = GetOrderCasingNormalizedStringValues(varyParamsValue);
|
||||||
|
|
||||||
// Update vary rules if they are different
|
// Update vary rules if they are different
|
||||||
if (context.CachedVaryByRules == null ||
|
if (context.CachedVaryByRules == null ||
|
||||||
|
|
@ -374,7 +375,7 @@ namespace Microsoft.AspNetCore.ResponseCaching
|
||||||
}
|
}
|
||||||
|
|
||||||
// Normalize order and casing
|
// Normalize order and casing
|
||||||
internal static StringValues GetNormalizedStringValues(StringValues stringValues)
|
internal static StringValues GetOrderCasingNormalizedStringValues(StringValues stringValues)
|
||||||
{
|
{
|
||||||
if (stringValues.Count == 1)
|
if (stringValues.Count == 1)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -410,6 +410,18 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
|
||||||
Assert.NotNull(context.CachedResponse);
|
Assert.NotNull(context.CachedResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void FinalizeCachingHeaders_SplitsVaryHeaderByCommas()
|
||||||
|
{
|
||||||
|
var middleware = TestUtils.CreateTestMiddleware();
|
||||||
|
var context = TestUtils.CreateTestContext();
|
||||||
|
context.HttpContext.Response.Headers[HeaderNames.Vary] = "HeaderB, heaDera";
|
||||||
|
|
||||||
|
middleware.FinalizeCacheHeaders(context);
|
||||||
|
|
||||||
|
Assert.Equal(new StringValues(new[] { "HEADERA", "HEADERB" }), context.CachedVaryByRules.Headers);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task FinalizeCacheBody_StoreResponseBodySeparately_IfLargerThanLimit()
|
public async Task FinalizeCacheBody_StoreResponseBodySeparately_IfLargerThanLimit()
|
||||||
{
|
{
|
||||||
|
|
@ -554,26 +566,35 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void NormalizeStringValues_NormalizesCasingToUpper()
|
public void GetOrderCasingNormalizedStringValues_NormalizesCasingToUpper()
|
||||||
{
|
{
|
||||||
var uppercaseStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
|
var uppercaseStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
|
||||||
var lowercaseStrings = new StringValues(new[] { "stringA", "stringB" });
|
var lowercaseStrings = new StringValues(new[] { "stringA", "stringB" });
|
||||||
|
|
||||||
var normalizedStrings = ResponseCacheMiddleware.GetNormalizedStringValues(lowercaseStrings);
|
var normalizedStrings = ResponseCacheMiddleware.GetOrderCasingNormalizedStringValues(lowercaseStrings);
|
||||||
|
|
||||||
Assert.Equal(uppercaseStrings, normalizedStrings);
|
Assert.Equal(uppercaseStrings, normalizedStrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void NormalizeStringValues_NormalizesOrder()
|
public void GetOrderCasingNormalizedStringValues_NormalizesOrder()
|
||||||
{
|
{
|
||||||
var orderedStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
|
var orderedStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
|
||||||
var reverseOrderStrings = new StringValues(new[] { "STRINGB", "STRINGA" });
|
var reverseOrderStrings = new StringValues(new[] { "STRINGB", "STRINGA" });
|
||||||
|
|
||||||
var normalizedStrings = ResponseCacheMiddleware.GetNormalizedStringValues(reverseOrderStrings);
|
var normalizedStrings = ResponseCacheMiddleware.GetOrderCasingNormalizedStringValues(reverseOrderStrings);
|
||||||
|
|
||||||
Assert.Equal(orderedStrings, normalizedStrings);
|
Assert.Equal(orderedStrings, normalizedStrings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetOrderCasingNormalizedStringValues_PreservesCommas()
|
||||||
|
{
|
||||||
|
var originalStrings = new StringValues(new[] { "STRINGA, STRINGB" });
|
||||||
|
|
||||||
|
var normalizedStrings = ResponseCacheMiddleware.GetOrderCasingNormalizedStringValues(originalStrings);
|
||||||
|
|
||||||
|
Assert.Equal(originalStrings, normalizedStrings);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue