Skip to content

Commit 1150b21

Browse files
authored
HTTP2: Fix known header type not reset for multi-value headers (#24918)
1 parent 9177683 commit 1150b21

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

src/Servers/Kestrel/Core/src/Internal/Http2/Http2HeaderEnumerator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,18 @@ private bool MoveNextOnStringEnumerator(string key)
9090

9191
private bool SetCurrent(string name, StringValues value, KnownHeaderType knownHeaderType)
9292
{
93+
_knownHeaderType = knownHeaderType;
94+
9395
if (value.Count == 1)
9496
{
9597
Current = new KeyValuePair<string, string>(name, value.ToString());
96-
_knownHeaderType = knownHeaderType;
9798
_hasMultipleValues = false;
9899
return true;
99100
}
100101
else
101102
{
102103
_stringValuesEnumerator = value.GetEnumerator();
103104
_hasMultipleValues = true;
104-
105105
return MoveNextOnStringEnumerator(name);
106106
}
107107
}

src/Servers/Kestrel/Core/test/Http2HeadersEnumeratorTests.cs

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Collections.Generic;
55
using System.Linq;
6+
using System.Net.Http.HPack;
67
using Microsoft.AspNetCore.Http;
78
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
89
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
@@ -21,7 +22,8 @@ public void CanIterateOverResponseHeaders()
2122
ContentLength = 9,
2223
HeaderAcceptRanges = "AcceptRanges!",
2324
HeaderAge = new StringValues(new[] { "1", "2" }),
24-
HeaderDate = "Date!"
25+
HeaderDate = "Date!",
26+
HeaderGrpcEncoding = "Identity!"
2527
};
2628
responseHeaders.Append("Name1", "Value1");
2729
responseHeaders.Append("Name2", "Value2-1");
@@ -35,15 +37,16 @@ public void CanIterateOverResponseHeaders()
3537

3638
Assert.Equal(new[]
3739
{
38-
new KeyValuePair<string, string>("Date", "Date!"),
39-
new KeyValuePair<string, string>("Accept-Ranges", "AcceptRanges!"),
40-
new KeyValuePair<string, string>("Age", "1"),
41-
new KeyValuePair<string, string>("Age", "2"),
42-
new KeyValuePair<string, string>("Content-Length", "9"),
43-
new KeyValuePair<string, string>("Name1", "Value1"),
44-
new KeyValuePair<string, string>("Name2", "Value2-1"),
45-
new KeyValuePair<string, string>("Name2", "Value2-2"),
46-
new KeyValuePair<string, string>("Name3", "Value3"),
40+
CreateHeaderResult(H2StaticTable.Date, "Date", "Date!"),
41+
CreateHeaderResult(-1, "Grpc-Encoding", "Identity!"),
42+
CreateHeaderResult(H2StaticTable.AcceptRanges, "Accept-Ranges", "AcceptRanges!"),
43+
CreateHeaderResult(H2StaticTable.Age, "Age", "1"),
44+
CreateHeaderResult(H2StaticTable.Age, "Age", "2"),
45+
CreateHeaderResult(H2StaticTable.ContentLength, "Content-Length", "9"),
46+
CreateHeaderResult(-1, "Name1", "Value1"),
47+
CreateHeaderResult(-1, "Name2", "Value2-1"),
48+
CreateHeaderResult(-1, "Name2", "Value2-2"),
49+
CreateHeaderResult(-1, "Name3", "Value3"),
4750
}, headers);
4851
}
4952

@@ -67,11 +70,11 @@ public void CanIterateOverResponseTrailers()
6770

6871
Assert.Equal(new[]
6972
{
70-
new KeyValuePair<string, string>("ETag", "ETag!"),
71-
new KeyValuePair<string, string>("Name1", "Value1"),
72-
new KeyValuePair<string, string>("Name2", "Value2-1"),
73-
new KeyValuePair<string, string>("Name2", "Value2-2"),
74-
new KeyValuePair<string, string>("Name3", "Value3"),
73+
CreateHeaderResult(H2StaticTable.ETag, "ETag", "ETag!"),
74+
CreateHeaderResult(-1, "Name1", "Value1"),
75+
CreateHeaderResult(-1, "Name2", "Value2-1"),
76+
CreateHeaderResult(-1, "Name2", "Value2-2"),
77+
CreateHeaderResult(-1, "Name3", "Value3"),
7578
}, headers);
7679
}
7780

@@ -89,14 +92,17 @@ public void Initialize_ChangeHeadersSource_EnumeratorUsesNewSource()
8992
Assert.True(e.MoveNext());
9093
Assert.Equal("Name1", e.Current.Key);
9194
Assert.Equal("Value1", e.Current.Value);
95+
Assert.Equal(-1, e.HPackStaticTableId);
9296

9397
Assert.True(e.MoveNext());
9498
Assert.Equal("Name2", e.Current.Key);
9599
Assert.Equal("Value2-1", e.Current.Value);
100+
Assert.Equal(-1, e.HPackStaticTableId);
96101

97102
Assert.True(e.MoveNext());
98103
Assert.Equal("Name2", e.Current.Key);
99104
Assert.Equal("Value2-2", e.Current.Value);
105+
Assert.Equal(-1, e.HPackStaticTableId);
100106

101107
var responseTrailers = new HttpResponseTrailers
102108
{
@@ -111,30 +117,39 @@ public void Initialize_ChangeHeadersSource_EnumeratorUsesNewSource()
111117
Assert.True(e.MoveNext());
112118
Assert.Equal("Grpc-Status", e.Current.Key);
113119
Assert.Equal("1", e.Current.Value);
120+
Assert.Equal(-1, e.HPackStaticTableId);
114121

115122
Assert.True(e.MoveNext());
116123
Assert.Equal("Name1", e.Current.Key);
117124
Assert.Equal("Value1", e.Current.Value);
125+
Assert.Equal(-1, e.HPackStaticTableId);
118126

119127
Assert.True(e.MoveNext());
120128
Assert.Equal("Name2", e.Current.Key);
121129
Assert.Equal("Value2-1", e.Current.Value);
130+
Assert.Equal(-1, e.HPackStaticTableId);
122131

123132
Assert.True(e.MoveNext());
124133
Assert.Equal("Name2", e.Current.Key);
125134
Assert.Equal("Value2-2", e.Current.Value);
135+
Assert.Equal(-1, e.HPackStaticTableId);
126136

127137
Assert.False(e.MoveNext());
128138
}
129139

130-
private KeyValuePair<string, string>[] GetNormalizedHeaders(Http2HeadersEnumerator enumerator)
140+
private (int HPackStaticTableId, string Name, string Value)[] GetNormalizedHeaders(Http2HeadersEnumerator enumerator)
131141
{
132-
var headers = new List<KeyValuePair<string, string>>();
142+
var headers = new List<(int HPackStaticTableId, string Name, string Value)>();
133143
while (enumerator.MoveNext())
134144
{
135-
headers.Add(enumerator.Current);
145+
headers.Add(CreateHeaderResult(enumerator.HPackStaticTableId, enumerator.Current.Key, enumerator.Current.Value));
136146
}
137147
return headers.ToArray();
138148
}
149+
150+
private static (int HPackStaticTableId, string Key, string Value) CreateHeaderResult(int hPackStaticTableId, string key, string value)
151+
{
152+
return (hPackStaticTableId, key, value);
153+
}
139154
}
140155
}

0 commit comments

Comments
 (0)