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 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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue