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. // 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)
{ {

View File

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