From dd4799adfdf8e1166c7b2c95036ceaaf928f97df Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 14 Sep 2016 11:53:54 -0700 Subject: [PATCH] Split by commas when normalizing headers --- .../ResponseCacheMiddleware.cs | 9 +++--- .../ResponseCacheMiddlewareTests.cs | 29 ++++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNetCore.ResponseCaching/ResponseCacheMiddleware.cs b/src/Microsoft.AspNetCore.ResponseCaching/ResponseCacheMiddleware.cs index 5c395ad306..85b8fec0ea 100644 --- a/src/Microsoft.AspNetCore.ResponseCaching/ResponseCacheMiddleware.cs +++ b/src/Microsoft.AspNetCore.ResponseCaching/ResponseCacheMiddleware.cs @@ -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) { diff --git a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCacheMiddlewareTests.cs b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCacheMiddlewareTests.cs index a329104ed1..8ef4b51bf0 100644 --- a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCacheMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCacheMiddlewareTests.cs @@ -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); + } } }