Skip to content
This repository was archived by the owner on Mar 19, 2019. It is now read-only.

Commit 1bced59

Browse files
committed
Fix issue reading empty known headers #410
1 parent 1b5ba87 commit 1bced59

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/Microsoft.AspNetCore.Server.HttpSys/RequestProcessing/NativeRequestContext.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ internal string GetKnownHeader(HttpSysRequestHeader header)
272272
HttpApi.HTTP_KNOWN_HEADER* pKnownHeader = (&request->Headers.KnownHeaders) + headerIndex;
273273
// For known headers, when header value is empty, RawValueLength will be 0 and
274274
// pRawValue will point to empty string ("\0")
275-
if (pKnownHeader->pRawValue != null)
275+
if (pKnownHeader->RawValueLength > 0)
276276
{
277277
value = HeaderEncoding.GetString(pKnownHeader->pRawValue + fixup, pKnownHeader->RawValueLength);
278278
}

test/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests/Listener/RequestHeaderTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,56 @@ public async Task RequestHeaders_ClientSendsUtf8Headers_Success()
9393
}
9494
}
9595

96+
[ConditionalFact]
97+
public async Task RequestHeaders_ClientSendsKnownHeaderWithNoValue_Success()
98+
{
99+
string address;
100+
using (var server = Utilities.CreateHttpServer(out address))
101+
{
102+
string[] customValues = new string[] { "" };
103+
Task responseTask = SendRequestAsync(address, "If-None-Match", customValues);
104+
105+
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
106+
var requestHeaders = context.Request.Headers;
107+
Assert.Equal(3, requestHeaders.Count);
108+
Assert.Equal(new Uri(address).Authority, requestHeaders["Host"]);
109+
Assert.Equal(new[] { new Uri(address).Authority }, requestHeaders.GetValues("Host"));
110+
Assert.Equal("close", requestHeaders["Connection"]);
111+
Assert.Equal(new[] { "close" }, requestHeaders.GetValues("Connection"));
112+
Assert.Equal(StringValues.Empty, requestHeaders["If-None-Match"]);
113+
Assert.Empty(requestHeaders.GetValues("If-None-Match"));
114+
Assert.Equal("spacervalue", requestHeaders["Spacer-Header"]);
115+
context.Dispose();
116+
117+
await responseTask;
118+
}
119+
}
120+
121+
[ConditionalFact]
122+
public async Task RequestHeaders_ClientSendsUnknownHeaderWithNoValue_Success()
123+
{
124+
string address;
125+
using (var server = Utilities.CreateHttpServer(out address))
126+
{
127+
string[] customValues = new string[] { "" };
128+
Task responseTask = SendRequestAsync(address, "Custom-Header", customValues);
129+
130+
var context = await server.AcceptAsync(Utilities.DefaultTimeout);
131+
var requestHeaders = context.Request.Headers;
132+
Assert.Equal(4, requestHeaders.Count);
133+
Assert.Equal(new Uri(address).Authority, requestHeaders["Host"]);
134+
Assert.Equal(new[] { new Uri(address).Authority }, requestHeaders.GetValues("Host"));
135+
Assert.Equal("close", requestHeaders["Connection"]);
136+
Assert.Equal(new[] { "close" }, requestHeaders.GetValues("Connection"));
137+
Assert.Equal("", requestHeaders["Custom-Header"]);
138+
Assert.Empty(requestHeaders.GetValues("Custom-Header"));
139+
Assert.Equal("spacervalue", requestHeaders["Spacer-Header"]);
140+
context.Dispose();
141+
142+
await responseTask;
143+
}
144+
}
145+
96146
private async Task<string> SendRequestAsync(string uri)
97147
{
98148
using (HttpClient client = new HttpClient())

0 commit comments

Comments
 (0)