Store each header value separately
This commit is contained in:
parent
5e12a103a4
commit
a069f6b636
|
|
@ -93,7 +93,9 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
|
|||
// Header count (int)
|
||||
// Header(s)
|
||||
// Key (string)
|
||||
// Value (string)
|
||||
// ValueCount (int)
|
||||
// Value(s)
|
||||
// Value (string)
|
||||
// ContainsBody (bool)
|
||||
// Body length (int)
|
||||
// Body (byte[])
|
||||
|
|
@ -107,8 +109,20 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
|
|||
for (var index = 0; index < headerCount; index++)
|
||||
{
|
||||
var key = reader.ReadString();
|
||||
var value = reader.ReadString();
|
||||
headers[key] = value;
|
||||
var headerValueCount = reader.ReadInt32();
|
||||
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();
|
||||
|
|
@ -202,7 +216,11 @@ namespace Microsoft.AspNetCore.ResponseCaching.Internal
|
|||
foreach (var header in entry.Headers)
|
||||
{
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ using System.Linq;
|
|||
using System.Text;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.ResponseCaching.Internal;
|
||||
using Microsoft.Extensions.Primitives;
|
||||
using Xunit;
|
||||
|
||||
namespace Microsoft.AspNetCore.ResponseCaching.Tests
|
||||
|
|
@ -76,6 +77,40 @@ namespace Microsoft.AspNetCore.ResponseCaching.Tests
|
|||
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]
|
||||
public void RoundTrip_CachedVaryByRule_EmptyRules_Succeeds()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue