Improvements to appending request header

This commit is contained in:
Louis DeJardin 2015-07-17 00:32:21 -07:00 committed by Stephen Halter
parent 96b03ee212
commit f9cf9f1936
4 changed files with 1168 additions and 13 deletions

View File

@ -288,6 +288,32 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
((ICollection<KeyValuePair<string, string[]>>)MaybeUnknown)?.CopyTo(array, arrayIndex);
}}
public void Append(string key, string value)
{{
switch(key.Length)
{{{Each(loop.HeadersByLength, byLength => $@"
case {byLength.Key}:
{{{Each(byLength, header => $@"
if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase))
{{
if ({header.TestBit()})
{{
_{header.Identifier} = AppendValue(_{header.Identifier}, value);
}}
else
{{
{header.SetBit()};
_{header.Identifier} = new[] {{value}};
}}
return;
}}
")}}}
break;
")}}}
string[] existing;
Unknown[key] = Unknown.TryGetValue(key, out existing) ? AppendValue(existing, value) : new[] {{value}};
}}
public partial struct Enumerator
{{
public bool MoveNext()

View File

@ -23,6 +23,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
Terminated,
}
static Encoding _ascii = Encoding.ASCII;
Mode _mode;
private bool _resultStarted;
private bool _responseStarted;
@ -517,11 +518,11 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
ch2 != ' ' &&
ch2 != '\t')
{
var name = Encoding.ASCII.GetString(remaining.Array, remaining.Offset, colonIndex);
var name = _ascii.GetString(remaining.Array, remaining.Offset, colonIndex);
var value = "";
if (valueEndIndex != -1)
{
value = Encoding.ASCII.GetString(
value = _ascii.GetString(
remaining.Array, remaining.Offset + valueStartIndex, valueEndIndex - valueStartIndex);
}
if (wrappedHeaders)
@ -565,17 +566,7 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
private void AddRequestHeader(string name, string value)
{
string[] existing;
if (!RequestHeaders.TryGetValue(name, out existing) ||
existing == null ||
existing.Length == 0)
{
RequestHeaders[name] = new[] { value };
}
else
{
RequestHeaders[name] = existing.Concat(new[] { value }).ToArray();
}
_requestHeaders.Append(name, value);
}
}
}

View File

@ -11,6 +11,14 @@ namespace Microsoft.AspNet.Server.Kestrel.Http
protected Dictionary<string, string[]> Unknown => MaybeUnknown ?? (MaybeUnknown = new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase));
protected static string[] AppendValue(string[] existing, string append)
{
var appended = new string[existing.Length + 1];
Array.Copy(existing, appended, existing.Length);
appended[existing.Length] = append;
return appended;
}
protected virtual int GetCountFast()
{ throw new NotImplementedException(); }