Merge branch 'benaadams/fastpath-header-enumerator' into dev

This commit is contained in:
Stephen Halter 2015-09-28 12:21:58 -07:00
commit 6d3e5d3bf2
1 changed files with 31 additions and 33 deletions

View File

@ -418,7 +418,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
var status = ReasonPhrases.ToStatus(StatusCode, ReasonPhrase); var status = ReasonPhrases.ToStatus(StatusCode, ReasonPhrase);
var responseHeader = CreateResponseHeader(status, appCompleted, ResponseHeaders); var responseHeader = CreateResponseHeader(status, appCompleted);
SocketOutput.Write(responseHeader.Item1, immediate: immediate); SocketOutput.Write(responseHeader.Item1, immediate: immediate);
responseHeader.Item2.Dispose(); responseHeader.Item2.Dispose();
} }
@ -461,8 +461,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
private Tuple<ArraySegment<byte>, IDisposable> CreateResponseHeader( private Tuple<ArraySegment<byte>, IDisposable> CreateResponseHeader(
string status, string status,
bool appCompleted, bool appCompleted)
IEnumerable<KeyValuePair<string, StringValues>> headers)
{ {
var writer = new MemoryPoolTextWriter(Memory); var writer = new MemoryPoolTextWriter(Memory);
writer.Write(HttpVersion); writer.Write(HttpVersion);
@ -474,42 +473,41 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
var hasConnection = false; var hasConnection = false;
var hasTransferEncoding = false; var hasTransferEncoding = false;
var hasContentLength = false; var hasContentLength = false;
if (headers != null)
foreach (var header in _responseHeaders)
{ {
foreach (var header in headers) var isConnection = false;
if (!hasConnection &&
string.Equals(header.Key, "Connection", StringComparison.OrdinalIgnoreCase))
{ {
var isConnection = false; hasConnection = isConnection = true;
if (!hasConnection && }
string.Equals(header.Key, "Connection", StringComparison.OrdinalIgnoreCase)) else if (!hasTransferEncoding &&
{ string.Equals(header.Key, "Transfer-Encoding", StringComparison.OrdinalIgnoreCase))
hasConnection = isConnection = true; {
} hasTransferEncoding = true;
else if (!hasTransferEncoding && }
string.Equals(header.Key, "Transfer-Encoding", StringComparison.OrdinalIgnoreCase)) else if (!hasContentLength &&
{ string.Equals(header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase))
hasTransferEncoding = true; {
} hasContentLength = true;
else if (!hasContentLength && }
string.Equals(header.Key, "Content-Length", StringComparison.OrdinalIgnoreCase))
{
hasContentLength = true;
}
foreach (var value in header.Value) foreach (var value in header.Value)
{ {
writer.Write(header.Key); writer.Write(header.Key);
writer.Write(':'); writer.Write(':');
writer.Write(' '); writer.Write(' ');
writer.Write(value); writer.Write(value);
writer.Write('\r'); writer.Write('\r');
writer.Write('\n'); writer.Write('\n');
if (isConnection && value.IndexOf("close", StringComparison.OrdinalIgnoreCase) != -1) if (isConnection && value.IndexOf("close", StringComparison.OrdinalIgnoreCase) != -1)
{ {
_keepAlive = false; _keepAlive = false;
}
} }
} }
} }
if (_keepAlive && !hasTransferEncoding && !hasContentLength) if (_keepAlive && !hasTransferEncoding && !hasContentLength)