HTTP2: Fix known header type not reset for multi-value headers (#24918)
This commit is contained in:
parent
91776832e0
commit
1150b211cc
|
|
@ -90,10 +90,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
|
|
||||||
private bool SetCurrent(string name, StringValues value, KnownHeaderType knownHeaderType)
|
private bool SetCurrent(string name, StringValues value, KnownHeaderType knownHeaderType)
|
||||||
{
|
{
|
||||||
|
_knownHeaderType = knownHeaderType;
|
||||||
|
|
||||||
if (value.Count == 1)
|
if (value.Count == 1)
|
||||||
{
|
{
|
||||||
Current = new KeyValuePair<string, string>(name, value.ToString());
|
Current = new KeyValuePair<string, string>(name, value.ToString());
|
||||||
_knownHeaderType = knownHeaderType;
|
|
||||||
_hasMultipleValues = false;
|
_hasMultipleValues = false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -101,7 +102,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
|
||||||
{
|
{
|
||||||
_stringValuesEnumerator = value.GetEnumerator();
|
_stringValuesEnumerator = value.GetEnumerator();
|
||||||
_hasMultipleValues = true;
|
_hasMultipleValues = true;
|
||||||
|
|
||||||
return MoveNextOnStringEnumerator(name);
|
return MoveNextOnStringEnumerator(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Http.HPack;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
|
||||||
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
|
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
|
||||||
|
|
@ -21,7 +22,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
ContentLength = 9,
|
ContentLength = 9,
|
||||||
HeaderAcceptRanges = "AcceptRanges!",
|
HeaderAcceptRanges = "AcceptRanges!",
|
||||||
HeaderAge = new StringValues(new[] { "1", "2" }),
|
HeaderAge = new StringValues(new[] { "1", "2" }),
|
||||||
HeaderDate = "Date!"
|
HeaderDate = "Date!",
|
||||||
|
HeaderGrpcEncoding = "Identity!"
|
||||||
};
|
};
|
||||||
responseHeaders.Append("Name1", "Value1");
|
responseHeaders.Append("Name1", "Value1");
|
||||||
responseHeaders.Append("Name2", "Value2-1");
|
responseHeaders.Append("Name2", "Value2-1");
|
||||||
|
|
@ -35,15 +37,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
|
|
||||||
Assert.Equal(new[]
|
Assert.Equal(new[]
|
||||||
{
|
{
|
||||||
new KeyValuePair<string, string>("Date", "Date!"),
|
CreateHeaderResult(H2StaticTable.Date, "Date", "Date!"),
|
||||||
new KeyValuePair<string, string>("Accept-Ranges", "AcceptRanges!"),
|
CreateHeaderResult(-1, "Grpc-Encoding", "Identity!"),
|
||||||
new KeyValuePair<string, string>("Age", "1"),
|
CreateHeaderResult(H2StaticTable.AcceptRanges, "Accept-Ranges", "AcceptRanges!"),
|
||||||
new KeyValuePair<string, string>("Age", "2"),
|
CreateHeaderResult(H2StaticTable.Age, "Age", "1"),
|
||||||
new KeyValuePair<string, string>("Content-Length", "9"),
|
CreateHeaderResult(H2StaticTable.Age, "Age", "2"),
|
||||||
new KeyValuePair<string, string>("Name1", "Value1"),
|
CreateHeaderResult(H2StaticTable.ContentLength, "Content-Length", "9"),
|
||||||
new KeyValuePair<string, string>("Name2", "Value2-1"),
|
CreateHeaderResult(-1, "Name1", "Value1"),
|
||||||
new KeyValuePair<string, string>("Name2", "Value2-2"),
|
CreateHeaderResult(-1, "Name2", "Value2-1"),
|
||||||
new KeyValuePair<string, string>("Name3", "Value3"),
|
CreateHeaderResult(-1, "Name2", "Value2-2"),
|
||||||
|
CreateHeaderResult(-1, "Name3", "Value3"),
|
||||||
}, headers);
|
}, headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,11 +70,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
|
|
||||||
Assert.Equal(new[]
|
Assert.Equal(new[]
|
||||||
{
|
{
|
||||||
new KeyValuePair<string, string>("ETag", "ETag!"),
|
CreateHeaderResult(H2StaticTable.ETag, "ETag", "ETag!"),
|
||||||
new KeyValuePair<string, string>("Name1", "Value1"),
|
CreateHeaderResult(-1, "Name1", "Value1"),
|
||||||
new KeyValuePair<string, string>("Name2", "Value2-1"),
|
CreateHeaderResult(-1, "Name2", "Value2-1"),
|
||||||
new KeyValuePair<string, string>("Name2", "Value2-2"),
|
CreateHeaderResult(-1, "Name2", "Value2-2"),
|
||||||
new KeyValuePair<string, string>("Name3", "Value3"),
|
CreateHeaderResult(-1, "Name3", "Value3"),
|
||||||
}, headers);
|
}, headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -89,14 +92,17 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name1", e.Current.Key);
|
Assert.Equal("Name1", e.Current.Key);
|
||||||
Assert.Equal("Value1", e.Current.Value);
|
Assert.Equal("Value1", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name2", e.Current.Key);
|
Assert.Equal("Name2", e.Current.Key);
|
||||||
Assert.Equal("Value2-1", e.Current.Value);
|
Assert.Equal("Value2-1", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name2", e.Current.Key);
|
Assert.Equal("Name2", e.Current.Key);
|
||||||
Assert.Equal("Value2-2", e.Current.Value);
|
Assert.Equal("Value2-2", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
var responseTrailers = new HttpResponseTrailers
|
var responseTrailers = new HttpResponseTrailers
|
||||||
{
|
{
|
||||||
|
|
@ -111,30 +117,39 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Grpc-Status", e.Current.Key);
|
Assert.Equal("Grpc-Status", e.Current.Key);
|
||||||
Assert.Equal("1", e.Current.Value);
|
Assert.Equal("1", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name1", e.Current.Key);
|
Assert.Equal("Name1", e.Current.Key);
|
||||||
Assert.Equal("Value1", e.Current.Value);
|
Assert.Equal("Value1", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name2", e.Current.Key);
|
Assert.Equal("Name2", e.Current.Key);
|
||||||
Assert.Equal("Value2-1", e.Current.Value);
|
Assert.Equal("Value2-1", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.True(e.MoveNext());
|
Assert.True(e.MoveNext());
|
||||||
Assert.Equal("Name2", e.Current.Key);
|
Assert.Equal("Name2", e.Current.Key);
|
||||||
Assert.Equal("Value2-2", e.Current.Value);
|
Assert.Equal("Value2-2", e.Current.Value);
|
||||||
|
Assert.Equal(-1, e.HPackStaticTableId);
|
||||||
|
|
||||||
Assert.False(e.MoveNext());
|
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())
|
while (enumerator.MoveNext())
|
||||||
{
|
{
|
||||||
headers.Add(enumerator.Current);
|
headers.Add(CreateHeaderResult(enumerator.HPackStaticTableId, enumerator.Current.Key, enumerator.Current.Value));
|
||||||
}
|
}
|
||||||
return headers.ToArray();
|
return headers.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static (int HPackStaticTableId, string Key, string Value) CreateHeaderResult(int hPackStaticTableId, string key, string value)
|
||||||
|
{
|
||||||
|
return (hPackStaticTableId, key, value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue