HTTP2: Fix known header type not reset for multi-value headers (#24918)

This commit is contained in:
James Newton-King 2020-08-15 12:21:25 +12:00 committed by GitHub
parent 91776832e0
commit 1150b211cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 20 deletions

View File

@ -90,10 +90,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
private bool SetCurrent(string name, StringValues value, KnownHeaderType knownHeaderType)
{
_knownHeaderType = knownHeaderType;
if (value.Count == 1)
{
Current = new KeyValuePair<string, string>(name, value.ToString());
_knownHeaderType = knownHeaderType;
_hasMultipleValues = false;
return true;
}
@ -101,7 +102,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
{
_stringValuesEnumerator = value.GetEnumerator();
_hasMultipleValues = true;
return MoveNextOnStringEnumerator(name);
}
}

View File

@ -3,6 +3,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.HPack;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
@ -21,7 +22,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
ContentLength = 9,
HeaderAcceptRanges = "AcceptRanges!",
HeaderAge = new StringValues(new[] { "1", "2" }),
HeaderDate = "Date!"
HeaderDate = "Date!",
HeaderGrpcEncoding = "Identity!"
};
responseHeaders.Append("Name1", "Value1");
responseHeaders.Append("Name2", "Value2-1");
@ -35,15 +37,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Assert.Equal(new[]
{
new KeyValuePair<string, string>("Date", "Date!"),
new KeyValuePair<string, string>("Accept-Ranges", "AcceptRanges!"),
new KeyValuePair<string, string>("Age", "1"),
new KeyValuePair<string, string>("Age", "2"),
new KeyValuePair<string, string>("Content-Length", "9"),
new KeyValuePair<string, string>("Name1", "Value1"),
new KeyValuePair<string, string>("Name2", "Value2-1"),
new KeyValuePair<string, string>("Name2", "Value2-2"),
new KeyValuePair<string, string>("Name3", "Value3"),
CreateHeaderResult(H2StaticTable.Date, "Date", "Date!"),
CreateHeaderResult(-1, "Grpc-Encoding", "Identity!"),
CreateHeaderResult(H2StaticTable.AcceptRanges, "Accept-Ranges", "AcceptRanges!"),
CreateHeaderResult(H2StaticTable.Age, "Age", "1"),
CreateHeaderResult(H2StaticTable.Age, "Age", "2"),
CreateHeaderResult(H2StaticTable.ContentLength, "Content-Length", "9"),
CreateHeaderResult(-1, "Name1", "Value1"),
CreateHeaderResult(-1, "Name2", "Value2-1"),
CreateHeaderResult(-1, "Name2", "Value2-2"),
CreateHeaderResult(-1, "Name3", "Value3"),
}, headers);
}
@ -67,11 +70,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Assert.Equal(new[]
{
new KeyValuePair<string, string>("ETag", "ETag!"),
new KeyValuePair<string, string>("Name1", "Value1"),
new KeyValuePair<string, string>("Name2", "Value2-1"),
new KeyValuePair<string, string>("Name2", "Value2-2"),
new KeyValuePair<string, string>("Name3", "Value3"),
CreateHeaderResult(H2StaticTable.ETag, "ETag", "ETag!"),
CreateHeaderResult(-1, "Name1", "Value1"),
CreateHeaderResult(-1, "Name2", "Value2-1"),
CreateHeaderResult(-1, "Name2", "Value2-2"),
CreateHeaderResult(-1, "Name3", "Value3"),
}, headers);
}
@ -89,14 +92,17 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Assert.True(e.MoveNext());
Assert.Equal("Name1", e.Current.Key);
Assert.Equal("Value1", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.True(e.MoveNext());
Assert.Equal("Name2", e.Current.Key);
Assert.Equal("Value2-1", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.True(e.MoveNext());
Assert.Equal("Name2", e.Current.Key);
Assert.Equal("Value2-2", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
var responseTrailers = new HttpResponseTrailers
{
@ -111,30 +117,39 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
Assert.True(e.MoveNext());
Assert.Equal("Grpc-Status", e.Current.Key);
Assert.Equal("1", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.True(e.MoveNext());
Assert.Equal("Name1", e.Current.Key);
Assert.Equal("Value1", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.True(e.MoveNext());
Assert.Equal("Name2", e.Current.Key);
Assert.Equal("Value2-1", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.True(e.MoveNext());
Assert.Equal("Name2", e.Current.Key);
Assert.Equal("Value2-2", e.Current.Value);
Assert.Equal(-1, e.HPackStaticTableId);
Assert.False(e.MoveNext());
}
private KeyValuePair<string, string>[] GetNormalizedHeaders(Http2HeadersEnumerator enumerator)
private (int HPackStaticTableId, string Name, string Value)[] GetNormalizedHeaders(Http2HeadersEnumerator enumerator)
{
var headers = new List<KeyValuePair<string, string>>();
var headers = new List<(int HPackStaticTableId, string Name, string Value)>();
while (enumerator.MoveNext())
{
headers.Add(enumerator.Current);
headers.Add(CreateHeaderResult(enumerator.HPackStaticTableId, enumerator.Current.Key, enumerator.Current.Value));
}
return headers.ToArray();
}
private static (int HPackStaticTableId, string Key, string Value) CreateHeaderResult(int hPackStaticTableId, string key, string value)
{
return (hPackStaticTableId, key, value);
}
}
}