Split by commas when normalizing headers

This commit is contained in:
John Luo 2016-09-14 11:53:54 -07:00
parent 6c13371fa0
commit dd4799adfd
2 changed files with 30 additions and 8 deletions

View File

@ -2,6 +2,7 @@
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
@ -211,7 +212,7 @@ namespace Microsoft.AspNetCore.ResponseCaching
// Create the cache entry now
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;
context.CachedResponseValidFor = context.ResponseCacheControlHeaderValue.SharedMaxAge ??
context.ResponseCacheControlHeaderValue.MaxAge ??
@ -222,8 +223,8 @@ namespace Microsoft.AspNetCore.ResponseCaching
if (!StringValues.IsNullOrEmpty(varyHeaderValue) || !StringValues.IsNullOrEmpty(varyParamsValue))
{
// Normalize order and casing of vary by rules
var normalizedVaryHeaderValue = GetNormalizedStringValues(varyHeaderValue);
var normalizedVaryParamsValue = GetNormalizedStringValues(varyParamsValue);
var normalizedVaryHeaderValue = GetOrderCasingNormalizedStringValues(varyHeaderValue);
var normalizedVaryParamsValue = GetOrderCasingNormalizedStringValues(varyParamsValue);
// Update vary rules if they are different
if (context.CachedVaryByRules == null ||
@ -374,7 +375,7 @@ namespace Microsoft.AspNetCore.ResponseCaching
}
// Normalize order and casing
internal static StringValues GetNormalizedStringValues(StringValues stringValues)
internal static StringValues GetOrderCasingNormalizedStringValues(StringValues stringValues)
{
if (stringValues.Count == 1)
{

View File

@ -410,6 +410,18 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
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]
public async Task FinalizeCacheBody_StoreResponseBodySeparately_IfLargerThanLimit()
{
@ -554,26 +566,35 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
}
[Fact]
public void NormalizeStringValues_NormalizesCasingToUpper()
public void GetOrderCasingNormalizedStringValues_NormalizesCasingToUpper()
{
var uppercaseStrings = 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);
}
[Fact]
public void NormalizeStringValues_NormalizesOrder()
public void GetOrderCasingNormalizedStringValues_NormalizesOrder()
{
var orderedStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
var reverseOrderStrings = new StringValues(new[] { "STRINGB", "STRINGA" });
var normalizedStrings = ResponseCacheMiddleware.GetNormalizedStringValues(reverseOrderStrings);
var normalizedStrings = ResponseCacheMiddleware.GetOrderCasingNormalizedStringValues(reverseOrderStrings);
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);
}
}
}