diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs index 4ef78199..77ece186 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs @@ -188,6 +188,9 @@ public bool MoveNext() switch (attr) { case Attr.Delimiter: + _valueStart = _valueStart == -1 ? _offset : _valueStart; + _valueEnd = _valueEnd == -1 ? _offset : _valueEnd; + _trailingStart = _trailingStart == -1 ? _offset : _trailingStart; _leadingEnd = _offset; _mode = Mode.Produce; break; diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index a1fac365..4f89a8d0 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -10,6 +10,14 @@ namespace Microsoft.AspNetCore.Http { public class HeaderDictionaryTests { + public static TheoryData HeaderSegmentData => new TheoryData> + { + new[] { "Value1", "Value2", "Value3", "Value4" }, + new[] { "Value1", "", "Value3", "Value4" }, + new[] { "Value1", "", "", "Value4" }, + new[] { "", "", "", "" } + }; + [Fact] public void PropertiesAreAccessible() { @@ -26,5 +34,22 @@ public void PropertiesAreAccessible() Assert.Equal("Value1", headers["header1"]); Assert.Equal(new[] { "Value1" }, headers["header1"].ToArray()); } + + [Theory] + [MemberData(nameof(HeaderSegmentData))] + public void EmptyHeaderSegmentsAreParsable(IEnumerable segments) + { + var header = string.Join(",", segments); + + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", header}, + }); + + var result = headers.GetCommaSeparatedValues("Header1"); + + Assert.Equal(segments, result); + } } } \ No newline at end of file