From d43f05189a4da3f25c56b6c88823064e8933f1d5 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 3 Feb 2017 14:25:59 -0800 Subject: [PATCH] Overwrite headers when serving response from cache #101 --- .../ResponseCachingMiddleware.cs | 4 +-- .../ResponseCachingMiddlewareTests.cs | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingMiddleware.cs b/src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingMiddleware.cs index ed41f3cdaa..798679eebc 100644 --- a/src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingMiddleware.cs +++ b/src/Microsoft.AspNetCore.ResponseCaching/ResponseCachingMiddleware.cs @@ -152,7 +152,7 @@ namespace Microsoft.AspNetCore.ResponseCaching response.StatusCode = context.CachedResponse.StatusCode; foreach (var header in context.CachedResponse.Headers) { - response.Headers.Add(header); + response.Headers[header.Key] = header.Value; } // Note: int64 division truncates result and errors may be up to 1 second. This reduction in @@ -287,7 +287,7 @@ namespace Microsoft.AspNetCore.ResponseCaching { if (!string.Equals(header.Key, HeaderNames.Age, StringComparison.OrdinalIgnoreCase)) { - context.CachedResponse.Headers.Add(header); + context.CachedResponse.Headers[header.Key] = header.Value; } } } diff --git a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingMiddlewareTests.cs b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingMiddlewareTests.cs index fc66045bdb..3cda27ef28 100644 --- a/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.ResponseCaching.Tests/ResponseCachingMiddlewareTests.cs @@ -75,6 +75,35 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests LoggedMessage.CachedResponseServed); } + [Fact] + public async Task TryServeFromCacheAsync_CachedResponseFound_OverwritesExistingHeaders() + { + var cache = new TestResponseCache(); + var sink = new TestSink(); + var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey")); + var context = TestUtils.CreateTestContext(); + + context.HttpContext.Response.Headers["MyHeader"] = "OldValue"; + await cache.SetAsync( + "BaseKey", + new CachedResponse() + { + Headers = new HeaderDictionary() + { + { "MyHeader", "NewValue" } + }, + Body = new SegmentReadStream(new List(0), 0) + }, + TimeSpan.Zero); + + Assert.True(await middleware.TryServeFromCacheAsync(context)); + Assert.Equal("NewValue", context.HttpContext.Response.Headers["MyHeader"]); + Assert.Equal(1, cache.GetCount); + TestUtils.AssertLoggedMessages( + sink.Writes, + LoggedMessage.CachedResponseServed); + } + [Fact] public async Task TryServeFromCacheAsync_VaryByRuleFound_CachedResponseNotFound_Fails() {