Fast path header enumerator

Use strongly typed enumerable as interface's allocates.
This commit is contained in:
Ben Adams 2015-09-26 00:01:29 +01:00
parent a7b65efa75
commit 1718b69f22
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,9 +473,8 @@ 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; var isConnection = false;
if (!hasConnection && if (!hasConnection &&
@ -509,7 +507,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
_keepAlive = false; _keepAlive = false;
} }
} }
}
} }
if (_keepAlive && !hasTransferEncoding && !hasContentLength) if (_keepAlive && !hasTransferEncoding && !hasContentLength)