Store each header value separately

This commit is contained in:
John Luo 2016-09-21 12:48:00 -07:00
parent 5e12a103a4
commit a069f6b636
2 changed files with 57 additions and 4 deletions

View File

@ -93,7 +93,9 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
// Header count (int) // Header count (int)
// Header(s) // Header(s)
// Key (string) // Key (string)
// Value (string) // ValueCount (int)
// Value(s)
// Value (string)
// ContainsBody (bool) // ContainsBody (bool)
// Body length (int) // Body length (int)
// Body (byte[]) // Body (byte[])
@ -107,8 +109,20 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
for (var index = 0; index < headerCount; index++) for (var index = 0; index < headerCount; index++)
{ {
var key = reader.ReadString(); var key = reader.ReadString();
var value = reader.ReadString(); var headerValueCount = reader.ReadInt32();
headers[key] = value; if (headerValueCount > 1)
{
var headerValues = new string[headerValueCount];
for (var valueIndex = 0; valueIndex < headerValueCount; valueIndex++)
{
headerValues[valueIndex] = reader.ReadString();
}
headers[key] = headerValues;
}
else if (headerValueCount == 1)
{
headers[key] = reader.ReadString();
}
} }
var containsBody = reader.ReadBoolean(); var containsBody = reader.ReadBoolean();
@ -202,7 +216,11 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
foreach (var header in entry.Headers) foreach (var header in entry.Headers)
{ {
writer.Write(header.Key); writer.Write(header.Key);
writer.Write(header.Value); writer.Write(header.Value.Count);
foreach (var headerValue in header.Value)
{
writer.Write(headerValue);
}
} }
if (entry.Body == null) if (entry.Body == null)

View File

@ -6,6 +6,7 @@ using System.Linq;
using System.Text; using System.Text;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.ResponseCaching.Internal; using Microsoft.AspNetCore.ResponseCaching.Internal;
using Microsoft.Extensions.Primitives;
using Xunit; using Xunit;
namespace Microsoft.AspNetCore.ResponseCaching.Tests namespace Microsoft.AspNetCore.ResponseCaching.Tests
@ -76,6 +77,40 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
AssertCachedResponseEqual(cachedResponse, (CachedResponse)CacheEntrySerializer.Deserialize(CacheEntrySerializer.Serialize(cachedResponse))); AssertCachedResponseEqual(cachedResponse, (CachedResponse)CacheEntrySerializer.Deserialize(CacheEntrySerializer.Serialize(cachedResponse)));
} }
[Fact]
public void RoundTrip_CachedResponseWithMultivalueHeaders_Succeeds()
{
var headers = new HeaderDictionary();
headers["keyA"] = new StringValues(new[] { "ValueA", "ValueB" });
var cachedResponse = new CachedResponse()
{
BodyKeyPrefix = FastGuid.NewGuid().IdString,
Created = DateTimeOffset.UtcNow,
StatusCode = StatusCodes.Status200OK,
Body = Encoding.ASCII.GetBytes("Hello world"),
Headers = headers
};
AssertCachedResponseEqual(cachedResponse, (CachedResponse)CacheEntrySerializer.Deserialize(CacheEntrySerializer.Serialize(cachedResponse)));
}
[Fact]
public void RoundTrip_CachedResponseWithEmptyHeaders_Succeeds()
{
var headers = new HeaderDictionary();
headers["keyA"] = StringValues.Empty;
var cachedResponse = new CachedResponse()
{
BodyKeyPrefix = FastGuid.NewGuid().IdString,
Created = DateTimeOffset.UtcNow,
StatusCode = StatusCodes.Status200OK,
Body = Encoding.ASCII.GetBytes("Hello world"),
Headers = headers
};
AssertCachedResponseEqual(cachedResponse, (CachedResponse)CacheEntrySerializer.Deserialize(CacheEntrySerializer.Serialize(cachedResponse)));
}
[Fact] [Fact]
public void RoundTrip_CachedVaryByRule_EmptyRules_Succeeds() public void RoundTrip_CachedVaryByRule_EmptyRules_Succeeds()
{ {