Skip to content

Commit 69f60b3

Browse files
authored
Preserve parsed & raw header value ordering (#67227)
1 parent a7c5546 commit 69f60b3

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/libraries/System.Net.Http/src/System/Net/Http/Headers/HttpHeaders.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,8 +1162,8 @@ internal static void GetStoreValuesAsStringOrStringArray(HeaderDescriptor descri
11621162
}
11631163

11641164
int currentIndex = 0;
1165-
ReadStoreValues<string?>(values, info.RawValue, null, ref currentIndex);
11661165
ReadStoreValues<object?>(values, info.ParsedAndInvalidValues, descriptor.Parser, ref currentIndex);
1166+
ReadStoreValues<string?>(values, info.RawValue, null, ref currentIndex);
11671167

11681168
Debug.Assert(currentIndex == length);
11691169
}
@@ -1196,8 +1196,8 @@ internal static int GetStoreValuesIntoStringArray(HeaderDescriptor descriptor, o
11961196
}
11971197

11981198
int currentIndex = 0;
1199-
ReadStoreValues<string?>(values, info.RawValue, null, ref currentIndex);
12001199
ReadStoreValues<object?>(values, info.ParsedAndInvalidValues, descriptor.Parser, ref currentIndex);
1200+
ReadStoreValues<string?>(values, info.RawValue, null, ref currentIndex);
12011201
Debug.Assert(currentIndex == length);
12021202
}
12031203

@@ -1208,9 +1208,7 @@ private static int GetValueCount(HeaderStoreItemInfo info)
12081208
{
12091209
Debug.Assert(info != null);
12101210

1211-
int valueCount = Count<string>(info.RawValue);
1212-
valueCount += Count<object>(info.ParsedAndInvalidValues);
1213-
return valueCount;
1211+
return Count<object>(info.ParsedAndInvalidValues) + Count<string>(info.RawValue);
12141212

12151213
static int Count<T>(object? valueStore) =>
12161214
valueStore is null ? 0 :

src/libraries/System.Net.Http/tests/UnitTests/Headers/HttpHeadersTest.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,25 @@ public void TryAddWithoutValidation_ValidAndInvalidValues_InsertionOrderIsPreser
5151
Assert.Equal(new[] { "text/bar", "invalid", "text/baz" }, accept);
5252
}
5353

54+
[Fact]
55+
public void MixedAddAndTryAddWithoutValidation_ParsedAndRawValues_InsertionOrderIsPreserved()
56+
{
57+
HttpHeaders headers = new HttpRequestMessage().Headers;
58+
59+
headers.Add("Accept", "text/foo");
60+
headers.TryAddWithoutValidation("Accept", "text/bar");
61+
headers.TryAddWithoutValidation("Accept", "invalid");
62+
63+
var expectedValues = new string[] { "text/foo", "text/bar", "invalid" };
64+
65+
Assert.Equal(expectedValues, headers.NonValidated["Accept"]);
66+
67+
Assert.True(headers.TryGetValues("Accept", out IEnumerable<string>? values));
68+
Assert.Equal(expectedValues, values);
69+
70+
Assert.Equal(expectedValues, headers.NonValidated["Accept"]);
71+
}
72+
5473
[Theory]
5574
[InlineData(null)]
5675
[InlineData("")]
@@ -1431,7 +1450,7 @@ public void NonValidated_SetValidAndInvalidHeaderValues_AllHeaderValuesReturned(
14311450
headers.TryAddWithoutValidation(headers.Descriptor, "value2,value3");
14321451
headers.TryAddWithoutValidation(headers.Descriptor, invalidHeaderValue);
14331452

1434-
string expectedValue = "value2,value3---" + invalidHeaderValue + "---" + parsedPrefix + "1";
1453+
string expectedValue = $"{parsedPrefix}1---value2,value3---{invalidHeaderValue}";
14351454

14361455
Assert.Equal(1, headers.NonValidated.Count);
14371456

0 commit comments

Comments
 (0)