Skip to content

Commit aa03df0

Browse files
authored
Fix method HttpHeadersNonValidated uses to get HeaderDescriptor (#62150)
We have two non-public methods for getting a HeaderDescriptor from a string name, one static on HeaderDescriptor and one instance on HttpHeaders. HttpHeadersNonValidated was using the former, but this then doesn't take into account custom logic used by HttpHeaders in other methods, like TryAddWithoutValidation, which means some methods on HttpHeadersNonValidated can't find the corresponding headers.
1 parent 9857fe0 commit aa03df0

File tree

3 files changed

+41
-3
lines changed

3 files changed

+41
-3
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,7 +1051,7 @@ private HeaderDescriptor GetHeaderDescriptor(string name)
10511051
throw new InvalidOperationException(SR.Format(SR.net_http_headers_not_allowed_header_name, name));
10521052
}
10531053

1054-
private bool TryGetHeaderDescriptor(string name, out HeaderDescriptor descriptor)
1054+
internal bool TryGetHeaderDescriptor(string name, out HeaderDescriptor descriptor)
10551055
{
10561056
if (string.IsNullOrEmpty(name))
10571057
{

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace System.Net.Http.Headers
3232
/// <returns>true if the collection contains the header; otherwise, false.</returns>
3333
public bool Contains(string headerName) =>
3434
_headers is HttpHeaders headers &&
35-
HeaderDescriptor.TryGet(headerName, out HeaderDescriptor descriptor) &&
35+
headers.TryGetHeaderDescriptor(headerName, out HeaderDescriptor descriptor) &&
3636
headers.TryGetHeaderValue(descriptor, out _);
3737

3838
/// <summary>Gets the values for the specified header name.</summary>
@@ -62,7 +62,7 @@ public HeaderStringValues this[string headerName]
6262
public bool TryGetValues(string headerName, out HeaderStringValues values)
6363
{
6464
if (_headers is HttpHeaders headers &&
65-
HeaderDescriptor.TryGet(headerName, out HeaderDescriptor descriptor) &&
65+
headers.TryGetHeaderDescriptor(headerName, out HeaderDescriptor descriptor) &&
6666
headers.TryGetHeaderValue(descriptor, out object? info))
6767
{
6868
HttpHeaders.GetStoreValuesAsStringOrStringArray(descriptor, info, out string? singleValue, out string[]? multiValue);

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2112,6 +2112,44 @@ public void AddHeaders_SourceHasInvalidHeaderValues_InvalidHeadersRemovedFromSou
21122112
Assert.False(destination.Contains("custom"), "destination contains 'custom' header.");
21132113
}
21142114

2115+
[Fact]
2116+
public void AddHeaders_ResponseHeaderToRequestHeaders_Success()
2117+
{
2118+
const string Name = "WWW-Authenticate";
2119+
const string Value = "Basic realm=\"Access to the staging site\", charset=\"UTF-8\"";
2120+
2121+
var request = new HttpRequestMessage();
2122+
Assert.True(request.Headers.TryAddWithoutValidation(Name, Value));
2123+
2124+
Assert.True(request.Headers.Contains(Name));
2125+
Assert.True(request.Headers.NonValidated.Contains(Name));
2126+
2127+
Assert.True(request.Headers.TryGetValues(Name, out IEnumerable<string> values));
2128+
Assert.Equal(Value, values.Single());
2129+
2130+
Assert.True(request.Headers.NonValidated.TryGetValues(Name, out HeaderStringValues nvValues));
2131+
Assert.Equal(Value, nvValues.Single());
2132+
}
2133+
2134+
[Fact]
2135+
public void AddHeaders_RequestHeaderToResponseHeaders_Success()
2136+
{
2137+
const string Name = "Referer";
2138+
const string Value = "https://dot.net";
2139+
2140+
var response = new HttpResponseMessage();
2141+
Assert.True(response.Headers.TryAddWithoutValidation(Name, Value));
2142+
2143+
Assert.True(response.Headers.Contains(Name));
2144+
Assert.True(response.Headers.NonValidated.Contains(Name));
2145+
2146+
Assert.True(response.Headers.TryGetValues(Name, out IEnumerable<string> values));
2147+
Assert.Equal(Value, values.Single());
2148+
2149+
Assert.True(response.Headers.NonValidated.TryGetValues(Name, out HeaderStringValues nvValues));
2150+
Assert.Equal(Value, nvValues.Single());
2151+
}
2152+
21152153
[Fact]
21162154
public void HeaderStringValues_Default_Empty()
21172155
{

0 commit comments

Comments
 (0)