From 2c5dd5ff41faad8e52c15e411981b49c6f64b1ef Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 20 Jan 2017 00:48:53 +0000 Subject: [PATCH 01/18] Use ContentLength as primary data source --- .../Internal/Http/Frame.cs | 17 +- .../Internal/Http/FrameHeaders.Generated.cs | 2798 ++++++++--------- .../Internal/Http/FrameHeaders.cs | 9 +- .../Internal/Http/FrameResponseHeaders.cs | 6 +- .../Internal/Http/MessageBody.cs | 13 +- .../Infrastructure/MemoryPoolIterator.cs | 29 +- .../DefaultHeaderTests.cs | 4 +- .../FrameResponseHeadersTests.cs | 30 +- .../KnownHeaders.cs | 194 +- 9 files changed, 1527 insertions(+), 1573 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs index 66868595f..377a1e598 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs @@ -41,7 +41,6 @@ public abstract partial class Frame : IFrameControl private static readonly byte[] _bytesConnectionKeepAlive = Encoding.ASCII.GetBytes("\r\nConnection: keep-alive"); private static readonly byte[] _bytesTransferEncodingChunked = Encoding.ASCII.GetBytes("\r\nTransfer-Encoding: chunked"); private static readonly byte[] _bytesHttpVersion11 = Encoding.ASCII.GetBytes("HTTP/1.1 "); - private static readonly byte[] _bytesContentLengthZero = Encoding.ASCII.GetBytes("\r\nContent-Length: 0"); private static readonly byte[] _bytesEndHeaders = Encoding.ASCII.GetBytes("\r\n\r\n"); private static readonly byte[] _bytesServer = Encoding.ASCII.GetBytes("\r\nServer: Kestrel"); @@ -658,11 +657,11 @@ private void VerifyAndUpdateWrite(int count) if (responseHeaders != null && !responseHeaders.HasTransferEncoding && responseHeaders.HasContentLength && - _responseBytesWritten + count > responseHeaders.HeaderContentLengthValue.Value) + _responseBytesWritten + count > responseHeaders.ContentLength.Value) { _keepAlive = false; throw new InvalidOperationException( - $"Response Content-Length mismatch: too many bytes written ({_responseBytesWritten + count} of {responseHeaders.HeaderContentLengthValue.Value})."); + $"Response Content-Length mismatch: too many bytes written ({_responseBytesWritten + count} of {responseHeaders.ContentLength.Value})."); } _responseBytesWritten += count; @@ -680,7 +679,7 @@ private void CheckLastWrite() if (responseHeaders != null && !responseHeaders.HasTransferEncoding && responseHeaders.HasContentLength && - _responseBytesWritten == responseHeaders.HeaderContentLengthValue.Value) + _responseBytesWritten == responseHeaders.ContentLength.Value) { _abortedCts = null; } @@ -692,8 +691,8 @@ protected void VerifyResponseContentLength() if (!HttpMethods.IsHead(Method) && !responseHeaders.HasTransferEncoding && - responseHeaders.HeaderContentLengthValue.HasValue && - _responseBytesWritten < responseHeaders.HeaderContentLengthValue.Value) + responseHeaders.ContentLength.HasValue && + _responseBytesWritten < responseHeaders.ContentLength.Value) { // We need to close the connection if any bytes were written since the client // cannot be certain of how many bytes it will receive. @@ -703,7 +702,7 @@ protected void VerifyResponseContentLength() } ReportApplicationError(new InvalidOperationException( - $"Response Content-Length mismatch: too few bytes written ({_responseBytesWritten} of {responseHeaders.HeaderContentLengthValue.Value}).")); + $"Response Content-Length mismatch: too few bytes written ({_responseBytesWritten} of {responseHeaders.ContentLength.Value}).")); } } @@ -926,7 +925,7 @@ private void CreateResponseHeader( { // Since the app has completed and we are only now generating // the headers we can safely set the Content-Length to 0. - responseHeaders.SetRawContentLength("0", _bytesContentLengthZero); + responseHeaders.ContentLength = 0; } else { @@ -1468,7 +1467,7 @@ private void SetErrorResponseHeaders(int statusCode) var dateHeaderValues = DateHeaderValueManager.GetDateHeaderValues(); responseHeaders.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes); - responseHeaders.SetRawContentLength("0", _bytesContentLengthZero); + responseHeaders.ContentLength = 0; if (ServerOptions.AddServerHeader) { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index eaa963843..cd4ef1173 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -191,27 +191,11 @@ public StringValues HeaderAllow _headers._Allow = value; } } - public StringValues HeaderContentLength - { - get - { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentLength; - } - return StringValues.Empty; - } - set - { - _bits |= 2048L; - _headers._ContentLength = value; - } - } public StringValues HeaderContentType { get { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { return _headers._ContentType; } @@ -219,7 +203,7 @@ public StringValues HeaderContentType } set { - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = value; } } @@ -227,7 +211,7 @@ public StringValues HeaderContentEncoding { get { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { return _headers._ContentEncoding; } @@ -235,7 +219,7 @@ public StringValues HeaderContentEncoding } set { - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = value; } } @@ -243,7 +227,7 @@ public StringValues HeaderContentLanguage { get { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { return _headers._ContentLanguage; } @@ -251,7 +235,7 @@ public StringValues HeaderContentLanguage } set { - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = value; } } @@ -259,7 +243,7 @@ public StringValues HeaderContentLocation { get { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { return _headers._ContentLocation; } @@ -267,7 +251,7 @@ public StringValues HeaderContentLocation } set { - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = value; } } @@ -275,7 +259,7 @@ public StringValues HeaderContentMD5 { get { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { return _headers._ContentMD5; } @@ -283,7 +267,7 @@ public StringValues HeaderContentMD5 } set { - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = value; } } @@ -291,7 +275,7 @@ public StringValues HeaderContentRange { get { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { return _headers._ContentRange; } @@ -299,7 +283,7 @@ public StringValues HeaderContentRange } set { - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; } } @@ -307,7 +291,7 @@ public StringValues HeaderExpires { get { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { return _headers._Expires; } @@ -315,7 +299,7 @@ public StringValues HeaderExpires } set { - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; } } @@ -323,7 +307,7 @@ public StringValues HeaderLastModified { get { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { return _headers._LastModified; } @@ -331,7 +315,7 @@ public StringValues HeaderLastModified } set { - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; } } @@ -339,7 +323,7 @@ public StringValues HeaderAccept { get { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { return _headers._Accept; } @@ -347,7 +331,7 @@ public StringValues HeaderAccept } set { - _bits |= 1048576L; + _bits |= 524288L; _headers._Accept = value; } } @@ -355,7 +339,7 @@ public StringValues HeaderAcceptCharset { get { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { return _headers._AcceptCharset; } @@ -363,7 +347,7 @@ public StringValues HeaderAcceptCharset } set { - _bits |= 2097152L; + _bits |= 1048576L; _headers._AcceptCharset = value; } } @@ -371,7 +355,7 @@ public StringValues HeaderAcceptEncoding { get { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { return _headers._AcceptEncoding; } @@ -379,7 +363,7 @@ public StringValues HeaderAcceptEncoding } set { - _bits |= 4194304L; + _bits |= 2097152L; _headers._AcceptEncoding = value; } } @@ -387,7 +371,7 @@ public StringValues HeaderAcceptLanguage { get { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { return _headers._AcceptLanguage; } @@ -395,7 +379,7 @@ public StringValues HeaderAcceptLanguage } set { - _bits |= 8388608L; + _bits |= 4194304L; _headers._AcceptLanguage = value; } } @@ -403,7 +387,7 @@ public StringValues HeaderAuthorization { get { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { return _headers._Authorization; } @@ -411,7 +395,7 @@ public StringValues HeaderAuthorization } set { - _bits |= 16777216L; + _bits |= 8388608L; _headers._Authorization = value; } } @@ -419,7 +403,7 @@ public StringValues HeaderCookie { get { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { return _headers._Cookie; } @@ -427,7 +411,7 @@ public StringValues HeaderCookie } set { - _bits |= 33554432L; + _bits |= 16777216L; _headers._Cookie = value; } } @@ -435,7 +419,7 @@ public StringValues HeaderExpect { get { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { return _headers._Expect; } @@ -443,7 +427,7 @@ public StringValues HeaderExpect } set { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Expect = value; } } @@ -451,7 +435,7 @@ public StringValues HeaderFrom { get { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { return _headers._From; } @@ -459,7 +443,7 @@ public StringValues HeaderFrom } set { - _bits |= 134217728L; + _bits |= 67108864L; _headers._From = value; } } @@ -467,7 +451,7 @@ public StringValues HeaderHost { get { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { return _headers._Host; } @@ -475,7 +459,7 @@ public StringValues HeaderHost } set { - _bits |= 268435456L; + _bits |= 134217728L; _headers._Host = value; } } @@ -483,7 +467,7 @@ public StringValues HeaderIfMatch { get { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { return _headers._IfMatch; } @@ -491,7 +475,7 @@ public StringValues HeaderIfMatch } set { - _bits |= 536870912L; + _bits |= 268435456L; _headers._IfMatch = value; } } @@ -499,7 +483,7 @@ public StringValues HeaderIfModifiedSince { get { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { return _headers._IfModifiedSince; } @@ -507,7 +491,7 @@ public StringValues HeaderIfModifiedSince } set { - _bits |= 1073741824L; + _bits |= 536870912L; _headers._IfModifiedSince = value; } } @@ -515,7 +499,7 @@ public StringValues HeaderIfNoneMatch { get { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { return _headers._IfNoneMatch; } @@ -523,7 +507,7 @@ public StringValues HeaderIfNoneMatch } set { - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._IfNoneMatch = value; } } @@ -531,7 +515,7 @@ public StringValues HeaderIfRange { get { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { return _headers._IfRange; } @@ -539,7 +523,7 @@ public StringValues HeaderIfRange } set { - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._IfRange = value; } } @@ -547,7 +531,7 @@ public StringValues HeaderIfUnmodifiedSince { get { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { return _headers._IfUnmodifiedSince; } @@ -555,7 +539,7 @@ public StringValues HeaderIfUnmodifiedSince } set { - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._IfUnmodifiedSince = value; } } @@ -563,7 +547,7 @@ public StringValues HeaderMaxForwards { get { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { return _headers._MaxForwards; } @@ -571,7 +555,7 @@ public StringValues HeaderMaxForwards } set { - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._MaxForwards = value; } } @@ -579,7 +563,7 @@ public StringValues HeaderProxyAuthorization { get { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { return _headers._ProxyAuthorization; } @@ -587,7 +571,7 @@ public StringValues HeaderProxyAuthorization } set { - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._ProxyAuthorization = value; } } @@ -595,7 +579,7 @@ public StringValues HeaderReferer { get { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { return _headers._Referer; } @@ -603,7 +587,7 @@ public StringValues HeaderReferer } set { - _bits |= 68719476736L; + _bits |= 34359738368L; _headers._Referer = value; } } @@ -611,7 +595,7 @@ public StringValues HeaderRange { get { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { return _headers._Range; } @@ -619,7 +603,7 @@ public StringValues HeaderRange } set { - _bits |= 137438953472L; + _bits |= 68719476736L; _headers._Range = value; } } @@ -627,7 +611,7 @@ public StringValues HeaderTE { get { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { return _headers._TE; } @@ -635,7 +619,7 @@ public StringValues HeaderTE } set { - _bits |= 274877906944L; + _bits |= 137438953472L; _headers._TE = value; } } @@ -643,7 +627,7 @@ public StringValues HeaderTranslate { get { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { return _headers._Translate; } @@ -651,7 +635,7 @@ public StringValues HeaderTranslate } set { - _bits |= 549755813888L; + _bits |= 274877906944L; _headers._Translate = value; } } @@ -659,7 +643,7 @@ public StringValues HeaderUserAgent { get { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { return _headers._UserAgent; } @@ -667,7 +651,7 @@ public StringValues HeaderUserAgent } set { - _bits |= 1099511627776L; + _bits |= 549755813888L; _headers._UserAgent = value; } } @@ -675,7 +659,7 @@ public StringValues HeaderOrigin { get { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { return _headers._Origin; } @@ -683,7 +667,7 @@ public StringValues HeaderOrigin } set { - _bits |= 2199023255552L; + _bits |= 1099511627776L; _headers._Origin = value; } } @@ -691,7 +675,7 @@ public StringValues HeaderAccessControlRequestMethod { get { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { return _headers._AccessControlRequestMethod; } @@ -699,7 +683,7 @@ public StringValues HeaderAccessControlRequestMethod } set { - _bits |= 4398046511104L; + _bits |= 2199023255552L; _headers._AccessControlRequestMethod = value; } } @@ -707,7 +691,7 @@ public StringValues HeaderAccessControlRequestHeaders { get { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { return _headers._AccessControlRequestHeaders; } @@ -715,14 +699,29 @@ public StringValues HeaderAccessControlRequestHeaders } set { - _bits |= 8796093022208L; + _bits |= 4398046511104L; _headers._AccessControlRequestHeaders = value; } } + public StringValues HeaderContentLength + { + get + { + if (ContentLength.HasValue) + { + return ContentLength.ToString(); + } + return StringValues.Empty; + } + set + { + ContentLength = ParseContentLength(value); + } + } protected override int GetCountFast() { - return BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } protected override StringValues GetValueFast(string key) { @@ -744,7 +743,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { return _headers._ContentRange; } @@ -756,7 +755,7 @@ protected override StringValues GetValueFast(string key) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { return _headers._LastModified; } @@ -768,7 +767,7 @@ protected override StringValues GetValueFast(string key) if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { return _headers._Authorization; } @@ -780,7 +779,7 @@ protected override StringValues GetValueFast(string key) if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { return _headers._IfNoneMatch; } @@ -791,7 +790,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -820,7 +818,7 @@ protected override StringValues GetValueFast(string key) if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { return _headers._UserAgent; } @@ -831,7 +829,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -848,7 +845,7 @@ protected override StringValues GetValueFast(string key) if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { return _headers._From; } @@ -860,7 +857,7 @@ protected override StringValues GetValueFast(string key) if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { return _headers._Host; } @@ -871,7 +868,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -888,7 +884,7 @@ protected override StringValues GetValueFast(string key) if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { return _headers._Accept; } @@ -900,7 +896,7 @@ protected override StringValues GetValueFast(string key) if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { return _headers._Cookie; } @@ -912,7 +908,7 @@ protected override StringValues GetValueFast(string key) if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { return _headers._Expect; } @@ -924,7 +920,7 @@ protected override StringValues GetValueFast(string key) if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { return _headers._Origin; } @@ -935,7 +931,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -976,7 +971,7 @@ protected override StringValues GetValueFast(string key) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { return _headers._Expires; } @@ -988,7 +983,7 @@ protected override StringValues GetValueFast(string key) if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { return _headers._Referer; } @@ -999,7 +994,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -1016,7 +1010,7 @@ protected override StringValues GetValueFast(string key) if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { return _headers._IfModifiedSince; } @@ -1027,7 +1021,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -1043,7 +1036,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -1060,7 +1052,7 @@ protected override StringValues GetValueFast(string key) if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { return _headers._Range; } @@ -1071,40 +1063,11 @@ protected override StringValues GetValueFast(string key) } } break; - - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentLength; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2097152L) != 0)) - { - return _headers._AcceptCharset; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { return _headers._ContentType; } @@ -1116,7 +1079,7 @@ protected override StringValues GetValueFast(string key) if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { return _headers._MaxForwards; } @@ -1127,12 +1090,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { return _headers._ContentEncoding; } @@ -1144,7 +1106,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { return _headers._ContentLanguage; } @@ -1156,7 +1118,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { return _headers._ContentLocation; } @@ -1167,12 +1129,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { return _headers._ContentMD5; } @@ -1183,14 +1144,13 @@ protected override StringValues GetValueFast(string key) } } break; - - case 15: + case 14: { - if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 1048576L) != 0)) { - return _headers._AcceptEncoding; + return _headers._AcceptCharset; } else { @@ -1198,11 +1158,11 @@ protected override StringValues GetValueFast(string key) } } - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (ContentLength.HasValue) { - return _headers._AcceptLanguage; + return ContentLength.ToString(); } else { @@ -1211,14 +1171,13 @@ protected override StringValues GetValueFast(string key) } } break; - - case 8: + case 15: { - if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 2097152L) != 0)) { - return _headers._IfMatch; + return _headers._AcceptEncoding; } else { @@ -1226,9 +1185,36 @@ protected override StringValues GetValueFast(string key) } } - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 4194304L) != 0)) + { + return _headers._AcceptLanguage; + } + else + { + ThrowKeyNotFoundException(); + } + } + } + break; + case 8: + { + if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (((_bits & 268435456L) != 0)) + { + return _headers._IfMatch; + } + else + { + ThrowKeyNotFoundException(); + } + } + + if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (((_bits & 2147483648L) != 0)) { return _headers._IfRange; } @@ -1239,12 +1225,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 19: { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { return _headers._IfUnmodifiedSince; } @@ -1256,7 +1241,7 @@ protected override StringValues GetValueFast(string key) if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { return _headers._ProxyAuthorization; } @@ -1267,12 +1252,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 2: { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { return _headers._TE; } @@ -1283,12 +1267,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 9: { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { return _headers._Translate; } @@ -1299,12 +1282,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 29: { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { return _headers._AccessControlRequestMethod; } @@ -1315,12 +1297,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 30: { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { return _headers._AccessControlRequestHeaders; } @@ -1331,7 +1312,7 @@ protected override StringValues GetValueFast(string key) } } break; -} + } if (MaybeUnknown == null) { ThrowKeyNotFoundException(); @@ -1360,7 +1341,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { value = _headers._ContentRange; return true; @@ -1374,7 +1355,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { value = _headers._LastModified; return true; @@ -1388,7 +1369,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { value = _headers._Authorization; return true; @@ -1402,7 +1383,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { value = _headers._IfNoneMatch; return true; @@ -1448,7 +1429,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { value = _headers._UserAgent; return true; @@ -1480,7 +1461,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { value = _headers._From; return true; @@ -1494,7 +1475,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { value = _headers._Host; return true; @@ -1526,7 +1507,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { value = _headers._Accept; return true; @@ -1540,7 +1521,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { value = _headers._Cookie; return true; @@ -1554,7 +1535,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { value = _headers._Expect; return true; @@ -1568,7 +1549,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { value = _headers._Origin; return true; @@ -1628,7 +1609,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { value = _headers._Expires; return true; @@ -1642,7 +1623,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { value = _headers._Referer; return true; @@ -1674,7 +1655,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { value = _headers._IfModifiedSince; return true; @@ -1724,7 +1705,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { value = _headers._Range; return true; @@ -1738,13 +1719,13 @@ protected override bool TryGetValueFast(string key, out StringValues value) } break; - case 14: + case 12: { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 2048L) != 0)) { - value = _headers._ContentLength; + value = _headers._ContentType; return true; } else @@ -1754,11 +1735,11 @@ protected override bool TryGetValueFast(string key, out StringValues value) } } - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 8589934592L) != 0)) { - value = _headers._AcceptCharset; + value = _headers._MaxForwards; return true; } else @@ -1770,13 +1751,13 @@ protected override bool TryGetValueFast(string key, out StringValues value) } break; - case 12: + case 16: { - if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 4096L) != 0)) { - value = _headers._ContentType; + value = _headers._ContentEncoding; return true; } else @@ -1786,11 +1767,11 @@ protected override bool TryGetValueFast(string key, out StringValues value) } } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8192L) != 0)) { - value = _headers._MaxForwards; + value = _headers._ContentLanguage; return true; } else @@ -1799,16 +1780,12 @@ protected override bool TryGetValueFast(string key, out StringValues value) return false; } } - } - break; - - case 16: - { - if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) + + if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 16384L) != 0)) { - value = _headers._ContentEncoding; + value = _headers._ContentLocation; return true; } else @@ -1817,12 +1794,16 @@ protected override bool TryGetValueFast(string key, out StringValues value) return false; } } - - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) + } + break; + + case 11: + { + if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 32768L) != 0)) { - value = _headers._ContentLanguage; + value = _headers._ContentMD5; return true; } else @@ -1831,12 +1812,16 @@ protected override bool TryGetValueFast(string key, out StringValues value) return false; } } - - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) + } + break; + + case 14: + { + if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 1048576L) != 0)) { - value = _headers._ContentLocation; + value = _headers._AcceptCharset; return true; } else @@ -1845,16 +1830,12 @@ protected override bool TryGetValueFast(string key, out StringValues value) return false; } } - } - break; - - case 11: - { - if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) + + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (ContentLength.HasValue) { - value = _headers._ContentMD5; + value = ContentLength.ToString(); return true; } else @@ -1870,7 +1851,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { value = _headers._AcceptEncoding; return true; @@ -1884,7 +1865,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { value = _headers._AcceptLanguage; return true; @@ -1902,7 +1883,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { value = _headers._IfMatch; return true; @@ -1916,7 +1897,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { value = _headers._IfRange; return true; @@ -1934,7 +1915,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { value = _headers._IfUnmodifiedSince; return true; @@ -1948,7 +1929,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { value = _headers._ProxyAuthorization; return true; @@ -1966,7 +1947,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { value = _headers._TE; return true; @@ -1984,7 +1965,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { value = _headers._Translate; return true; @@ -2002,7 +1983,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { value = _headers._AccessControlRequestMethod; return true; @@ -2020,7 +2001,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { value = _headers._AccessControlRequestHeaders; return true; @@ -2053,28 +2034,28 @@ protected override void SetValueFast(string key, StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; return; } if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; return; } if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16777216L; + _bits |= 8388608L; _headers._Authorization = value; return; } if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._IfNoneMatch = value; return; } @@ -2099,7 +2080,7 @@ protected override void SetValueFast(string key, StringValues value) if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1099511627776L; + _bits |= 549755813888L; _headers._UserAgent = value; return; } @@ -2117,14 +2098,14 @@ protected override void SetValueFast(string key, StringValues value) if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 134217728L; + _bits |= 67108864L; _headers._From = value; return; } if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 268435456L; + _bits |= 134217728L; _headers._Host = value; return; } @@ -2142,28 +2123,28 @@ protected override void SetValueFast(string key, StringValues value) if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1048576L; + _bits |= 524288L; _headers._Accept = value; return; } if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 33554432L; + _bits |= 16777216L; _headers._Cookie = value; return; } if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Expect = value; return; } if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2199023255552L; + _bits |= 1099511627776L; _headers._Origin = value; return; } @@ -2195,14 +2176,14 @@ protected override void SetValueFast(string key, StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; return; } if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 68719476736L; + _bits |= 34359738368L; _headers._Referer = value; return; } @@ -2220,7 +2201,7 @@ protected override void SetValueFast(string key, StringValues value) if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1073741824L; + _bits |= 536870912L; _headers._IfModifiedSince = value; return; } @@ -2249,43 +2230,25 @@ protected override void SetValueFast(string key, StringValues value) if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 137438953472L; + _bits |= 68719476736L; _headers._Range = value; return; } } break; - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - _bits |= 2048L; - _headers._ContentLength = value; - return; - } - - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - _bits |= 2097152L; - _headers._AcceptCharset = value; - return; - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = value; return; } if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._MaxForwards = value; return; } @@ -2296,21 +2259,21 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = value; return; } if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = value; return; } if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = value; return; } @@ -2321,25 +2284,42 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = value; return; } } break; + case 14: + { + if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + _bits |= 1048576L; + _headers._AcceptCharset = value; + return; + } + + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + ContentLength = ParseContentLength(value); + return; + } + } + break; + case 15: { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4194304L; + _bits |= 2097152L; _headers._AcceptEncoding = value; return; } if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8388608L; + _bits |= 4194304L; _headers._AcceptLanguage = value; return; } @@ -2350,14 +2330,14 @@ protected override void SetValueFast(string key, StringValues value) { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 536870912L; + _bits |= 268435456L; _headers._IfMatch = value; return; } if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._IfRange = value; return; } @@ -2368,14 +2348,14 @@ protected override void SetValueFast(string key, StringValues value) { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._IfUnmodifiedSince = value; return; } if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._ProxyAuthorization = value; return; } @@ -2386,7 +2366,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 274877906944L; + _bits |= 137438953472L; _headers._TE = value; return; } @@ -2397,7 +2377,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 549755813888L; + _bits |= 274877906944L; _headers._Translate = value; return; } @@ -2408,7 +2388,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4398046511104L; + _bits |= 2199023255552L; _headers._AccessControlRequestMethod = value; return; } @@ -2419,7 +2399,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8796093022208L; + _bits |= 4398046511104L; _headers._AccessControlRequestHeaders = value; return; } @@ -2449,44 +2429,44 @@ protected override void AddValueFast(string key, StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; return; } if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; return; } if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 16777216L; + _bits |= 8388608L; _headers._Authorization = value; return; } if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._IfNoneMatch = value; return; } @@ -2519,11 +2499,11 @@ protected override void AddValueFast(string key, StringValues value) if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 1099511627776L; + _bits |= 549755813888L; _headers._UserAgent = value; return; } @@ -2545,22 +2525,22 @@ protected override void AddValueFast(string key, StringValues value) if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 134217728L; + _bits |= 67108864L; _headers._From = value; return; } if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 268435456L; + _bits |= 134217728L; _headers._Host = value; return; } @@ -2582,44 +2562,44 @@ protected override void AddValueFast(string key, StringValues value) if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 1048576L; + _bits |= 524288L; _headers._Accept = value; return; } if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 33554432L; + _bits |= 16777216L; _headers._Cookie = value; return; } if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 67108864L; + _bits |= 33554432L; _headers._Expect = value; return; } if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 2199023255552L; + _bits |= 1099511627776L; _headers._Origin = value; return; } @@ -2663,22 +2643,22 @@ protected override void AddValueFast(string key, StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; return; } if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 68719476736L; + _bits |= 34359738368L; _headers._Referer = value; return; } @@ -2700,11 +2680,11 @@ protected override void AddValueFast(string key, StringValues value) if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 1073741824L; + _bits |= 536870912L; _headers._IfModifiedSince = value; return; } @@ -2741,116 +2721,118 @@ protected override void AddValueFast(string key, StringValues value) if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 137438953472L; + _bits |= 68719476736L; _headers._Range = value; return; } } break; - case 14: + case 12: { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 2048L) != 0)) { ThrowDuplicateKeyException(); } _bits |= 2048L; - _headers._ContentLength = value; + _headers._ContentType = value; return; } - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 8589934592L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 2097152L; - _headers._AcceptCharset = value; + _bits |= 8589934592L; + _headers._MaxForwards = value; return; } } break; - case 12: + case 16: { - if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 4096L) != 0)) { ThrowDuplicateKeyException(); } _bits |= 4096L; - _headers._ContentType = value; + _headers._ContentEncoding = value; return; } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 17179869184L) != 0)) - { - ThrowDuplicateKeyException(); - } - _bits |= 17179869184L; - _headers._MaxForwards = value; - return; - } - } - break; - - case 16: - { - if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 8192L) != 0)) { ThrowDuplicateKeyException(); } _bits |= 8192L; - _headers._ContentEncoding = value; + _headers._ContentLanguage = value; return; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 16384L) != 0)) { ThrowDuplicateKeyException(); } _bits |= 16384L; - _headers._ContentLanguage = value; + _headers._ContentLocation = value; return; } - - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) + } + break; + + case 11: + { + if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 32768L) != 0)) { ThrowDuplicateKeyException(); } _bits |= 32768L; - _headers._ContentLocation = value; + _headers._ContentMD5 = value; return; } } break; - case 11: + case 14: { - if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 1048576L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 65536L; - _headers._ContentMD5 = value; + _bits |= 1048576L; + _headers._AcceptCharset = value; + return; + } + + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (ContentLength.HasValue) + { + ThrowDuplicateKeyException(); + } + else + { + ContentLength = ParseContentLength(value); + } return; } } @@ -2860,22 +2842,22 @@ protected override void AddValueFast(string key, StringValues value) { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4194304L; + _bits |= 2097152L; _headers._AcceptEncoding = value; return; } if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8388608L; + _bits |= 4194304L; _headers._AcceptLanguage = value; return; } @@ -2886,22 +2868,22 @@ protected override void AddValueFast(string key, StringValues value) { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 536870912L; + _bits |= 268435456L; _headers._IfMatch = value; return; } if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._IfRange = value; return; } @@ -2912,22 +2894,22 @@ protected override void AddValueFast(string key, StringValues value) { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._IfUnmodifiedSince = value; return; } if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._ProxyAuthorization = value; return; } @@ -2938,11 +2920,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 274877906944L; + _bits |= 137438953472L; _headers._TE = value; return; } @@ -2953,11 +2935,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 549755813888L; + _bits |= 274877906944L; _headers._Translate = value; return; } @@ -2968,11 +2950,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4398046511104L; + _bits |= 2199023255552L; _headers._AccessControlRequestMethod = value; return; } @@ -2983,11 +2965,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8796093022208L; + _bits |= 4398046511104L; _headers._AccessControlRequestHeaders = value; return; } @@ -3019,9 +3001,9 @@ protected override bool RemoveFast(string key) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { - _bits &= ~131072L; + _bits &= ~65536L; _headers._ContentRange = StringValues.Empty; return true; } @@ -3033,9 +3015,9 @@ protected override bool RemoveFast(string key) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { - _bits &= ~524288L; + _bits &= ~262144L; _headers._LastModified = StringValues.Empty; return true; } @@ -3047,9 +3029,9 @@ protected override bool RemoveFast(string key) if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { - _bits &= ~16777216L; + _bits &= ~8388608L; _headers._Authorization = StringValues.Empty; return true; } @@ -3061,9 +3043,9 @@ protected override bool RemoveFast(string key) if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { - _bits &= ~2147483648L; + _bits &= ~1073741824L; _headers._IfNoneMatch = StringValues.Empty; return true; } @@ -3107,9 +3089,9 @@ protected override bool RemoveFast(string key) if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { - _bits &= ~1099511627776L; + _bits &= ~549755813888L; _headers._UserAgent = StringValues.Empty; return true; } @@ -3139,9 +3121,9 @@ protected override bool RemoveFast(string key) if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { - _bits &= ~134217728L; + _bits &= ~67108864L; _headers._From = StringValues.Empty; return true; } @@ -3153,9 +3135,9 @@ protected override bool RemoveFast(string key) if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { - _bits &= ~268435456L; + _bits &= ~134217728L; _headers._Host = StringValues.Empty; return true; } @@ -3185,9 +3167,9 @@ protected override bool RemoveFast(string key) if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { - _bits &= ~1048576L; + _bits &= ~524288L; _headers._Accept = StringValues.Empty; return true; } @@ -3199,9 +3181,9 @@ protected override bool RemoveFast(string key) if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { - _bits &= ~33554432L; + _bits &= ~16777216L; _headers._Cookie = StringValues.Empty; return true; } @@ -3213,9 +3195,9 @@ protected override bool RemoveFast(string key) if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { - _bits &= ~67108864L; + _bits &= ~33554432L; _headers._Expect = StringValues.Empty; return true; } @@ -3227,9 +3209,9 @@ protected override bool RemoveFast(string key) if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { - _bits &= ~2199023255552L; + _bits &= ~1099511627776L; _headers._Origin = StringValues.Empty; return true; } @@ -3287,9 +3269,9 @@ protected override bool RemoveFast(string key) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { - _bits &= ~262144L; + _bits &= ~131072L; _headers._Expires = StringValues.Empty; return true; } @@ -3301,9 +3283,9 @@ protected override bool RemoveFast(string key) if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { - _bits &= ~68719476736L; + _bits &= ~34359738368L; _headers._Referer = StringValues.Empty; return true; } @@ -3333,9 +3315,9 @@ protected override bool RemoveFast(string key) if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { - _bits &= ~1073741824L; + _bits &= ~536870912L; _headers._IfModifiedSince = StringValues.Empty; return true; } @@ -3383,9 +3365,9 @@ protected override bool RemoveFast(string key) if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { - _bits &= ~137438953472L; + _bits &= ~68719476736L; _headers._Range = StringValues.Empty; return true; } @@ -3397,14 +3379,14 @@ protected override bool RemoveFast(string key) } break; - case 14: + case 12: { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 2048L) != 0)) { _bits &= ~2048L; - _headers._ContentLength = StringValues.Empty; + _headers._ContentType = StringValues.Empty; return true; } else @@ -3413,12 +3395,12 @@ protected override bool RemoveFast(string key) } } - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 8589934592L) != 0)) { - _bits &= ~2097152L; - _headers._AcceptCharset = StringValues.Empty; + _bits &= ~8589934592L; + _headers._MaxForwards = StringValues.Empty; return true; } else @@ -3429,14 +3411,14 @@ protected override bool RemoveFast(string key) } break; - case 12: + case 16: { - if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (((_bits & 4096L) != 0)) { _bits &= ~4096L; - _headers._ContentType = StringValues.Empty; + _headers._ContentEncoding = StringValues.Empty; return true; } else @@ -3445,12 +3427,12 @@ protected override bool RemoveFast(string key) } } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) + if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8192L) != 0)) { - _bits &= ~17179869184L; - _headers._MaxForwards = StringValues.Empty; + _bits &= ~8192L; + _headers._ContentLanguage = StringValues.Empty; return true; } else @@ -3458,17 +3440,13 @@ protected override bool RemoveFast(string key) return false; } } - } - break; - - case 16: - { - if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) + + if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 16384L) != 0)) { - _bits &= ~8192L; - _headers._ContentEncoding = StringValues.Empty; + _bits &= ~16384L; + _headers._ContentLocation = StringValues.Empty; return true; } else @@ -3476,13 +3454,17 @@ protected override bool RemoveFast(string key) return false; } } - - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) + } + break; + + case 11: + { + if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 32768L) != 0)) { - _bits &= ~16384L; - _headers._ContentLanguage = StringValues.Empty; + _bits &= ~32768L; + _headers._ContentMD5 = StringValues.Empty; return true; } else @@ -3490,13 +3472,17 @@ protected override bool RemoveFast(string key) return false; } } - - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) + } + break; + + case 14: + { + if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 1048576L) != 0)) { - _bits &= ~32768L; - _headers._ContentLocation = StringValues.Empty; + _bits &= ~1048576L; + _headers._AcceptCharset = StringValues.Empty; return true; } else @@ -3504,17 +3490,12 @@ protected override bool RemoveFast(string key) return false; } } - } - break; - - case 11: - { - if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) + + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (ContentLength.HasValue) { - _bits &= ~65536L; - _headers._ContentMD5 = StringValues.Empty; + ContentLength = null; return true; } else @@ -3529,9 +3510,9 @@ protected override bool RemoveFast(string key) { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { - _bits &= ~4194304L; + _bits &= ~2097152L; _headers._AcceptEncoding = StringValues.Empty; return true; } @@ -3543,9 +3524,9 @@ protected override bool RemoveFast(string key) if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { - _bits &= ~8388608L; + _bits &= ~4194304L; _headers._AcceptLanguage = StringValues.Empty; return true; } @@ -3561,9 +3542,9 @@ protected override bool RemoveFast(string key) { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { - _bits &= ~536870912L; + _bits &= ~268435456L; _headers._IfMatch = StringValues.Empty; return true; } @@ -3575,9 +3556,9 @@ protected override bool RemoveFast(string key) if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { - _bits &= ~4294967296L; + _bits &= ~2147483648L; _headers._IfRange = StringValues.Empty; return true; } @@ -3593,9 +3574,9 @@ protected override bool RemoveFast(string key) { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { - _bits &= ~8589934592L; + _bits &= ~4294967296L; _headers._IfUnmodifiedSince = StringValues.Empty; return true; } @@ -3607,9 +3588,9 @@ protected override bool RemoveFast(string key) if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { - _bits &= ~34359738368L; + _bits &= ~17179869184L; _headers._ProxyAuthorization = StringValues.Empty; return true; } @@ -3625,9 +3606,9 @@ protected override bool RemoveFast(string key) { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { - _bits &= ~274877906944L; + _bits &= ~137438953472L; _headers._TE = StringValues.Empty; return true; } @@ -3643,9 +3624,9 @@ protected override bool RemoveFast(string key) { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { - _bits &= ~549755813888L; + _bits &= ~274877906944L; _headers._Translate = StringValues.Empty; return true; } @@ -3661,9 +3642,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { - _bits &= ~4398046511104L; + _bits &= ~2199023255552L; _headers._AccessControlRequestMethod = StringValues.Empty; return true; } @@ -3679,9 +3660,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { - _bits &= ~8796093022208L; + _bits &= ~4398046511104L; _headers._AccessControlRequestHeaders = StringValues.Empty; return true; } @@ -3698,38 +3679,38 @@ protected override bool RemoveFast(string key) protected override void ClearFast() { MaybeUnknown?.Clear(); - - if(FrameHeaders.BitCount(_bits) > 12) + ContentLength = null; + if(FrameHeaders.BitCount(_bits) > 11) { _headers = default(HeaderReferences); _bits = 0; return; } - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { _headers._Accept = default(StringValues); - _bits &= ~1048576L; + _bits &= ~524288L; if(_bits == 0) { return; } } - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { _headers._Host = default(StringValues); - _bits &= ~268435456L; + _bits &= ~134217728L; if(_bits == 0) { return; } } - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { _headers._UserAgent = default(StringValues); - _bits &= ~1099511627776L; + _bits &= ~549755813888L; if(_bits == 0) { return; @@ -3848,7 +3829,7 @@ protected override void ClearFast() if (((_bits & 2048L) != 0)) { - _headers._ContentLength = default(StringValues); + _headers._ContentType = default(StringValues); _bits &= ~2048L; if(_bits == 0) { @@ -3858,7 +3839,7 @@ protected override void ClearFast() if (((_bits & 4096L) != 0)) { - _headers._ContentType = default(StringValues); + _headers._ContentEncoding = default(StringValues); _bits &= ~4096L; if(_bits == 0) { @@ -3868,7 +3849,7 @@ protected override void ClearFast() if (((_bits & 8192L) != 0)) { - _headers._ContentEncoding = default(StringValues); + _headers._ContentLanguage = default(StringValues); _bits &= ~8192L; if(_bits == 0) { @@ -3878,7 +3859,7 @@ protected override void ClearFast() if (((_bits & 16384L) != 0)) { - _headers._ContentLanguage = default(StringValues); + _headers._ContentLocation = default(StringValues); _bits &= ~16384L; if(_bits == 0) { @@ -3888,7 +3869,7 @@ protected override void ClearFast() if (((_bits & 32768L) != 0)) { - _headers._ContentLocation = default(StringValues); + _headers._ContentMD5 = default(StringValues); _bits &= ~32768L; if(_bits == 0) { @@ -3898,7 +3879,7 @@ protected override void ClearFast() if (((_bits & 65536L) != 0)) { - _headers._ContentMD5 = default(StringValues); + _headers._ContentRange = default(StringValues); _bits &= ~65536L; if(_bits == 0) { @@ -3908,7 +3889,7 @@ protected override void ClearFast() if (((_bits & 131072L) != 0)) { - _headers._ContentRange = default(StringValues); + _headers._Expires = default(StringValues); _bits &= ~131072L; if(_bits == 0) { @@ -3918,7 +3899,7 @@ protected override void ClearFast() if (((_bits & 262144L) != 0)) { - _headers._Expires = default(StringValues); + _headers._LastModified = default(StringValues); _bits &= ~262144L; if(_bits == 0) { @@ -3926,10 +3907,10 @@ protected override void ClearFast() } } - if (((_bits & 524288L) != 0)) + if (((_bits & 1048576L) != 0)) { - _headers._LastModified = default(StringValues); - _bits &= ~524288L; + _headers._AcceptCharset = default(StringValues); + _bits &= ~1048576L; if(_bits == 0) { return; @@ -3938,7 +3919,7 @@ protected override void ClearFast() if (((_bits & 2097152L) != 0)) { - _headers._AcceptCharset = default(StringValues); + _headers._AcceptEncoding = default(StringValues); _bits &= ~2097152L; if(_bits == 0) { @@ -3948,7 +3929,7 @@ protected override void ClearFast() if (((_bits & 4194304L) != 0)) { - _headers._AcceptEncoding = default(StringValues); + _headers._AcceptLanguage = default(StringValues); _bits &= ~4194304L; if(_bits == 0) { @@ -3958,7 +3939,7 @@ protected override void ClearFast() if (((_bits & 8388608L) != 0)) { - _headers._AcceptLanguage = default(StringValues); + _headers._Authorization = default(StringValues); _bits &= ~8388608L; if(_bits == 0) { @@ -3968,7 +3949,7 @@ protected override void ClearFast() if (((_bits & 16777216L) != 0)) { - _headers._Authorization = default(StringValues); + _headers._Cookie = default(StringValues); _bits &= ~16777216L; if(_bits == 0) { @@ -3978,7 +3959,7 @@ protected override void ClearFast() if (((_bits & 33554432L) != 0)) { - _headers._Cookie = default(StringValues); + _headers._Expect = default(StringValues); _bits &= ~33554432L; if(_bits == 0) { @@ -3988,7 +3969,7 @@ protected override void ClearFast() if (((_bits & 67108864L) != 0)) { - _headers._Expect = default(StringValues); + _headers._From = default(StringValues); _bits &= ~67108864L; if(_bits == 0) { @@ -3996,10 +3977,10 @@ protected override void ClearFast() } } - if (((_bits & 134217728L) != 0)) + if (((_bits & 268435456L) != 0)) { - _headers._From = default(StringValues); - _bits &= ~134217728L; + _headers._IfMatch = default(StringValues); + _bits &= ~268435456L; if(_bits == 0) { return; @@ -4008,7 +3989,7 @@ protected override void ClearFast() if (((_bits & 536870912L) != 0)) { - _headers._IfMatch = default(StringValues); + _headers._IfModifiedSince = default(StringValues); _bits &= ~536870912L; if(_bits == 0) { @@ -4018,7 +3999,7 @@ protected override void ClearFast() if (((_bits & 1073741824L) != 0)) { - _headers._IfModifiedSince = default(StringValues); + _headers._IfNoneMatch = default(StringValues); _bits &= ~1073741824L; if(_bits == 0) { @@ -4028,7 +4009,7 @@ protected override void ClearFast() if (((_bits & 2147483648L) != 0)) { - _headers._IfNoneMatch = default(StringValues); + _headers._IfRange = default(StringValues); _bits &= ~2147483648L; if(_bits == 0) { @@ -4038,7 +4019,7 @@ protected override void ClearFast() if (((_bits & 4294967296L) != 0)) { - _headers._IfRange = default(StringValues); + _headers._IfUnmodifiedSince = default(StringValues); _bits &= ~4294967296L; if(_bits == 0) { @@ -4048,7 +4029,7 @@ protected override void ClearFast() if (((_bits & 8589934592L) != 0)) { - _headers._IfUnmodifiedSince = default(StringValues); + _headers._MaxForwards = default(StringValues); _bits &= ~8589934592L; if(_bits == 0) { @@ -4058,7 +4039,7 @@ protected override void ClearFast() if (((_bits & 17179869184L) != 0)) { - _headers._MaxForwards = default(StringValues); + _headers._ProxyAuthorization = default(StringValues); _bits &= ~17179869184L; if(_bits == 0) { @@ -4068,7 +4049,7 @@ protected override void ClearFast() if (((_bits & 34359738368L) != 0)) { - _headers._ProxyAuthorization = default(StringValues); + _headers._Referer = default(StringValues); _bits &= ~34359738368L; if(_bits == 0) { @@ -4078,7 +4059,7 @@ protected override void ClearFast() if (((_bits & 68719476736L) != 0)) { - _headers._Referer = default(StringValues); + _headers._Range = default(StringValues); _bits &= ~68719476736L; if(_bits == 0) { @@ -4088,7 +4069,7 @@ protected override void ClearFast() if (((_bits & 137438953472L) != 0)) { - _headers._Range = default(StringValues); + _headers._TE = default(StringValues); _bits &= ~137438953472L; if(_bits == 0) { @@ -4098,7 +4079,7 @@ protected override void ClearFast() if (((_bits & 274877906944L) != 0)) { - _headers._TE = default(StringValues); + _headers._Translate = default(StringValues); _bits &= ~274877906944L; if(_bits == 0) { @@ -4106,10 +4087,10 @@ protected override void ClearFast() } } - if (((_bits & 549755813888L) != 0)) + if (((_bits & 1099511627776L) != 0)) { - _headers._Translate = default(StringValues); - _bits &= ~549755813888L; + _headers._Origin = default(StringValues); + _bits &= ~1099511627776L; if(_bits == 0) { return; @@ -4118,7 +4099,7 @@ protected override void ClearFast() if (((_bits & 2199023255552L) != 0)) { - _headers._Origin = default(StringValues); + _headers._AccessControlRequestMethod = default(StringValues); _bits &= ~2199023255552L; if(_bits == 0) { @@ -4127,19 +4108,9 @@ protected override void ClearFast() } if (((_bits & 4398046511104L) != 0)) - { - _headers._AccessControlRequestMethod = default(StringValues); - _bits &= ~4398046511104L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 8796093022208L) != 0)) { _headers._AccessControlRequestHeaders = default(StringValues); - _bits &= ~8796093022208L; + _bits &= ~4398046511104L; if(_bits == 0) { return; @@ -4165,7 +4136,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Cache-Control", _headers._CacheControl); ++arrayIndex; } - if (((_bits & 2L) != 0)) { if (arrayIndex == array.Length) @@ -4176,7 +4146,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Connection", _headers._Connection); ++arrayIndex; } - if (((_bits & 4L) != 0)) { if (arrayIndex == array.Length) @@ -4187,7 +4156,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Date", _headers._Date); ++arrayIndex; } - if (((_bits & 8L) != 0)) { if (arrayIndex == array.Length) @@ -4198,7 +4166,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Keep-Alive", _headers._KeepAlive); ++arrayIndex; } - if (((_bits & 16L) != 0)) { if (arrayIndex == array.Length) @@ -4209,7 +4176,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Pragma", _headers._Pragma); ++arrayIndex; } - if (((_bits & 32L) != 0)) { if (arrayIndex == array.Length) @@ -4220,7 +4186,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Trailer", _headers._Trailer); ++arrayIndex; } - if (((_bits & 64L) != 0)) { if (arrayIndex == array.Length) @@ -4231,7 +4196,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Transfer-Encoding", _headers._TransferEncoding); ++arrayIndex; } - if (((_bits & 128L) != 0)) { if (arrayIndex == array.Length) @@ -4242,7 +4206,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Upgrade", _headers._Upgrade); ++arrayIndex; } - if (((_bits & 256L) != 0)) { if (arrayIndex == array.Length) @@ -4253,7 +4216,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Via", _headers._Via); ++arrayIndex; } - if (((_bits & 512L) != 0)) { if (arrayIndex == array.Length) @@ -4264,7 +4226,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Warning", _headers._Warning); ++arrayIndex; } - if (((_bits & 1024L) != 0)) { if (arrayIndex == array.Length) @@ -4275,7 +4236,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Allow", _headers._Allow); ++arrayIndex; } - if (((_bits & 2048L) != 0)) { if (arrayIndex == array.Length) @@ -4283,10 +4243,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Length", _headers._ContentLength); + array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); ++arrayIndex; } - if (((_bits & 4096L) != 0)) { if (arrayIndex == array.Length) @@ -4294,10 +4253,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); + array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); ++arrayIndex; } - if (((_bits & 8192L) != 0)) { if (arrayIndex == array.Length) @@ -4305,10 +4263,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); + array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); ++arrayIndex; } - if (((_bits & 16384L) != 0)) { if (arrayIndex == array.Length) @@ -4316,10 +4273,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); + array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); ++arrayIndex; } - if (((_bits & 32768L) != 0)) { if (arrayIndex == array.Length) @@ -4327,10 +4283,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); + array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); ++arrayIndex; } - if (((_bits & 65536L) != 0)) { if (arrayIndex == array.Length) @@ -4338,10 +4293,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); + array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); ++arrayIndex; } - if (((_bits & 131072L) != 0)) { if (arrayIndex == array.Length) @@ -4349,10 +4303,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); + array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); ++arrayIndex; } - if (((_bits & 262144L) != 0)) { if (arrayIndex == array.Length) @@ -4360,10 +4313,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); + array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); ++arrayIndex; } - if (((_bits & 524288L) != 0)) { if (arrayIndex == array.Length) @@ -4371,10 +4323,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); + array[arrayIndex] = new KeyValuePair("Accept", _headers._Accept); ++arrayIndex; } - if (((_bits & 1048576L) != 0)) { if (arrayIndex == array.Length) @@ -4382,10 +4333,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Accept", _headers._Accept); + array[arrayIndex] = new KeyValuePair("Accept-Charset", _headers._AcceptCharset); ++arrayIndex; } - if (((_bits & 2097152L) != 0)) { if (arrayIndex == array.Length) @@ -4393,10 +4343,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Accept-Charset", _headers._AcceptCharset); + array[arrayIndex] = new KeyValuePair("Accept-Encoding", _headers._AcceptEncoding); ++arrayIndex; } - if (((_bits & 4194304L) != 0)) { if (arrayIndex == array.Length) @@ -4404,10 +4353,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Accept-Encoding", _headers._AcceptEncoding); + array[arrayIndex] = new KeyValuePair("Accept-Language", _headers._AcceptLanguage); ++arrayIndex; } - if (((_bits & 8388608L) != 0)) { if (arrayIndex == array.Length) @@ -4415,10 +4363,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Accept-Language", _headers._AcceptLanguage); + array[arrayIndex] = new KeyValuePair("Authorization", _headers._Authorization); ++arrayIndex; } - if (((_bits & 16777216L) != 0)) { if (arrayIndex == array.Length) @@ -4426,10 +4373,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Authorization", _headers._Authorization); + array[arrayIndex] = new KeyValuePair("Cookie", _headers._Cookie); ++arrayIndex; } - if (((_bits & 33554432L) != 0)) { if (arrayIndex == array.Length) @@ -4437,10 +4383,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Cookie", _headers._Cookie); + array[arrayIndex] = new KeyValuePair("Expect", _headers._Expect); ++arrayIndex; } - if (((_bits & 67108864L) != 0)) { if (arrayIndex == array.Length) @@ -4448,10 +4393,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Expect", _headers._Expect); + array[arrayIndex] = new KeyValuePair("From", _headers._From); ++arrayIndex; } - if (((_bits & 134217728L) != 0)) { if (arrayIndex == array.Length) @@ -4459,10 +4403,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("From", _headers._From); + array[arrayIndex] = new KeyValuePair("Host", _headers._Host); ++arrayIndex; } - if (((_bits & 268435456L) != 0)) { if (arrayIndex == array.Length) @@ -4470,10 +4413,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Host", _headers._Host); + array[arrayIndex] = new KeyValuePair("If-Match", _headers._IfMatch); ++arrayIndex; } - if (((_bits & 536870912L) != 0)) { if (arrayIndex == array.Length) @@ -4481,10 +4423,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("If-Match", _headers._IfMatch); + array[arrayIndex] = new KeyValuePair("If-Modified-Since", _headers._IfModifiedSince); ++arrayIndex; } - if (((_bits & 1073741824L) != 0)) { if (arrayIndex == array.Length) @@ -4492,10 +4433,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("If-Modified-Since", _headers._IfModifiedSince); + array[arrayIndex] = new KeyValuePair("If-None-Match", _headers._IfNoneMatch); ++arrayIndex; } - if (((_bits & 2147483648L) != 0)) { if (arrayIndex == array.Length) @@ -4503,10 +4443,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("If-None-Match", _headers._IfNoneMatch); + array[arrayIndex] = new KeyValuePair("If-Range", _headers._IfRange); ++arrayIndex; } - if (((_bits & 4294967296L) != 0)) { if (arrayIndex == array.Length) @@ -4514,10 +4453,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("If-Range", _headers._IfRange); + array[arrayIndex] = new KeyValuePair("If-Unmodified-Since", _headers._IfUnmodifiedSince); ++arrayIndex; } - if (((_bits & 8589934592L) != 0)) { if (arrayIndex == array.Length) @@ -4525,10 +4463,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("If-Unmodified-Since", _headers._IfUnmodifiedSince); + array[arrayIndex] = new KeyValuePair("Max-Forwards", _headers._MaxForwards); ++arrayIndex; } - if (((_bits & 17179869184L) != 0)) { if (arrayIndex == array.Length) @@ -4536,10 +4473,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Max-Forwards", _headers._MaxForwards); + array[arrayIndex] = new KeyValuePair("Proxy-Authorization", _headers._ProxyAuthorization); ++arrayIndex; } - if (((_bits & 34359738368L) != 0)) { if (arrayIndex == array.Length) @@ -4547,10 +4483,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Proxy-Authorization", _headers._ProxyAuthorization); + array[arrayIndex] = new KeyValuePair("Referer", _headers._Referer); ++arrayIndex; } - if (((_bits & 68719476736L) != 0)) { if (arrayIndex == array.Length) @@ -4558,10 +4493,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Referer", _headers._Referer); + array[arrayIndex] = new KeyValuePair("Range", _headers._Range); ++arrayIndex; } - if (((_bits & 137438953472L) != 0)) { if (arrayIndex == array.Length) @@ -4569,10 +4503,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Range", _headers._Range); + array[arrayIndex] = new KeyValuePair("TE", _headers._TE); ++arrayIndex; } - if (((_bits & 274877906944L) != 0)) { if (arrayIndex == array.Length) @@ -4580,10 +4513,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("TE", _headers._TE); + array[arrayIndex] = new KeyValuePair("Translate", _headers._Translate); ++arrayIndex; } - if (((_bits & 549755813888L) != 0)) { if (arrayIndex == array.Length) @@ -4591,10 +4523,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Translate", _headers._Translate); + array[arrayIndex] = new KeyValuePair("User-Agent", _headers._UserAgent); ++arrayIndex; } - if (((_bits & 1099511627776L) != 0)) { if (arrayIndex == array.Length) @@ -4602,10 +4533,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("User-Agent", _headers._UserAgent); + array[arrayIndex] = new KeyValuePair("Origin", _headers._Origin); ++arrayIndex; } - if (((_bits & 2199023255552L) != 0)) { if (arrayIndex == array.Length) @@ -4613,10 +4543,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Origin", _headers._Origin); + array[arrayIndex] = new KeyValuePair("Access-Control-Request-Method", _headers._AccessControlRequestMethod); ++arrayIndex; } - if (((_bits & 4398046511104L) != 0)) { if (arrayIndex == array.Length) @@ -4624,21 +4553,19 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Request-Method", _headers._AccessControlRequestMethod); + array[arrayIndex] = new KeyValuePair("Access-Control-Request-Headers", _headers._AccessControlRequestHeaders); ++arrayIndex; } - - if (((_bits & 8796093022208L) != 0)) + if (ContentLength.HasValue) { if (arrayIndex == array.Length) { ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Request-Headers", _headers._AccessControlRequestHeaders); + array[arrayIndex] = new KeyValuePair("Content-Length", ContentLength.ToString()); ++arrayIndex; } - ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); } @@ -4657,13 +4584,13 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUI[0] & 3755991007u) == 1162036033u) && ((pUS[2] & 57311u) == 21584u))) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { _headers._Accept = AppendValue(_headers._Accept, value); } else { - _bits |= 1048576L; + _bits |= 524288L; _headers._Accept = new StringValues(value); } return; @@ -4675,13 +4602,13 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUI[0] & 3755991007u) == 1414745928u))) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { _headers._Host = AppendValue(_headers._Host, value); } else { - _bits |= 268435456L; + _bits |= 134217728L; _headers._Host = new StringValues(value); } return; @@ -4693,13 +4620,13 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUL[0] & 16131858680330051551uL) == 4992030374873092949uL) && ((pUS[4] & 57311u) == 21582u))) { - if (((_bits & 1099511627776L) != 0)) + if (((_bits & 549755813888L) != 0)) { _headers._UserAgent = AppendValue(_headers._UserAgent, value); } else { - _bits |= 1099511627776L; + _bits |= 549755813888L; _headers._UserAgent = new StringValues(value); } return; @@ -4743,13 +4670,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1196310866u) && ((pUB[12] & 223u) == 69u))) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { _headers._ContentRange = AppendValue(_headers._ContentRange, value); } else { - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = new StringValues(value); } return; @@ -4757,13 +4684,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858680330051551uL) == 4922237774822850892uL) && ((pUI[2] & 3755991007u) == 1162430025u) && ((pUB[12] & 223u) == 68u))) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { _headers._LastModified = AppendValue(_headers._LastModified, value); } else { - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = new StringValues(value); } return; @@ -4771,13 +4698,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542891098079uL) == 6505821637182772545uL) && ((pUI[2] & 3755991007u) == 1330205761u) && ((pUB[12] & 223u) == 78u))) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { _headers._Authorization = AppendValue(_headers._Authorization, value); } else { - _bits |= 16777216L; + _bits |= 8388608L; _headers._Authorization = new StringValues(value); } return; @@ -4785,13 +4712,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552106889183uL) == 3262099607620765257uL) && ((pUI[2] & 3755991007u) == 1129595213u) && ((pUB[12] & 223u) == 72u))) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { _headers._IfNoneMatch = AppendValue(_headers._IfNoneMatch, value); } else { - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._IfNoneMatch = new StringValues(value); } return; @@ -4849,13 +4776,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1297044038u))) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { _headers._From = AppendValue(_headers._From, value); } else { - _bits |= 134217728L; + _bits |= 67108864L; _headers._From = new StringValues(value); } return; @@ -4881,13 +4808,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1263488835u) && ((pUS[2] & 57311u) == 17737u))) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { _headers._Cookie = AppendValue(_headers._Cookie, value); } else { - _bits |= 33554432L; + _bits |= 16777216L; _headers._Cookie = new StringValues(value); } return; @@ -4895,13 +4822,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1162893381u) && ((pUS[2] & 57311u) == 21571u))) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { _headers._Expect = AppendValue(_headers._Expect, value); } else { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Expect = new StringValues(value); } return; @@ -4909,13 +4836,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1195987535u) && ((pUS[2] & 57311u) == 20041u))) { - if (((_bits & 2199023255552L) != 0)) + if (((_bits & 1099511627776L) != 0)) { _headers._Origin = AppendValue(_headers._Origin, value); } else { - _bits |= 2199023255552L; + _bits |= 1099511627776L; _headers._Origin = new StringValues(value); } return; @@ -4969,13 +4896,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1230002245u) && ((pUS[2] & 57311u) == 17746u) && ((pUB[6] & 223u) == 83u))) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { _headers._Expires = AppendValue(_headers._Expires, value); } else { - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = new StringValues(value); } return; @@ -4983,13 +4910,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1162233170u) && ((pUS[2] & 57311u) == 17746u) && ((pUB[6] & 223u) == 82u))) { - if (((_bits & 68719476736L) != 0)) + if (((_bits & 34359738368L) != 0)) { _headers._Referer = AppendValue(_headers._Referer, value); } else { - _bits |= 68719476736L; + _bits |= 34359738368L; _headers._Referer = new StringValues(value); } return; @@ -5015,13 +4942,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542893195231uL) == 5064654363342751305uL) && ((pUL[1] & 16131858543427968991uL) == 4849894470315165001uL) && ((pUB[16] & 223u) == 69u))) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { _headers._IfModifiedSince = AppendValue(_headers._IfModifiedSince, value); } else { - _bits |= 1073741824L; + _bits |= 536870912L; _headers._IfModifiedSince = new StringValues(value); } return; @@ -5065,13 +4992,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1196310866u) && ((pUB[4] & 223u) == 69u))) { - if (((_bits & 137438953472L) != 0)) + if (((_bits & 68719476736L) != 0)) { _headers._Range = AppendValue(_headers._Range, value); } else { - _bits |= 137438953472L; + _bits |= 68719476736L; _headers._Range = new StringValues(value); } return; @@ -5079,49 +5006,17 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int } break; - case 14: - { - if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1196311884u) && ((pUS[6] & 57311u) == 18516u))) - { - if (((_bits & 2048L) != 0)) - { - _headers._ContentLength = AppendValue(_headers._ContentLength, value); - } - else - { - _bits |= 2048L; - _headers._ContentLength = new StringValues(value); - } - return; - } - - if ((((pUL[0] & 16140865742145839071uL) == 4840617878229304129uL) && ((pUI[2] & 3755991007u) == 1397899592u) && ((pUS[6] & 57311u) == 21573u))) - { - if (((_bits & 2097152L) != 0)) - { - _headers._AcceptCharset = AppendValue(_headers._AcceptCharset, value); - } - else - { - _bits |= 2097152L; - _headers._AcceptCharset = new StringValues(value); - } - return; - } - } - break; - case 12: { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1162893652u))) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { _headers._ContentType = AppendValue(_headers._ContentType, value); } else { - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = new StringValues(value); } return; @@ -5129,13 +5024,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858543427968991uL) == 6292178792217067853uL) && ((pUI[2] & 3755991007u) == 1396986433u))) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { _headers._MaxForwards = AppendValue(_headers._MaxForwards, value); } else { - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._MaxForwards = new StringValues(value); } return; @@ -5147,13 +5042,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 5138124782612729413uL))) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { _headers._ContentEncoding = AppendValue(_headers._ContentEncoding, value); } else { - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = new StringValues(value); } return; @@ -5161,13 +5056,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 4992030546487820620uL))) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { _headers._ContentLanguage = AppendValue(_headers._ContentLanguage, value); } else { - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = new StringValues(value); } return; @@ -5175,13 +5070,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 5642809484339531596uL))) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { _headers._ContentLocation = AppendValue(_headers._ContentLocation, value); } else { - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = new StringValues(value); } return; @@ -5193,13 +5088,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUS[4] & 57311u) == 17485u) && ((pUB[10] & 255u) == 53u))) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { _headers._ContentMD5 = AppendValue(_headers._ContentMD5, value); } else { - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = new StringValues(value); } return; @@ -5207,17 +5102,48 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int } break; + case 14: + { + if ((((pUL[0] & 16140865742145839071uL) == 4840617878229304129uL) && ((pUI[2] & 3755991007u) == 1397899592u) && ((pUS[6] & 57311u) == 21573u))) + { + if (((_bits & 1048576L) != 0)) + { + _headers._AcceptCharset = AppendValue(_headers._AcceptCharset, value); + } + else + { + _bits |= 1048576L; + _headers._AcceptCharset = new StringValues(value); + } + return; + } + + if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1196311884u) && ((pUS[6] & 57311u) == 18516u))) + { + if (ContentLength.HasValue) + { + ThrowInvalidContentLengthException(AppendValue(ContentLength.ToString(), value).ToString()); + } + else + { + ContentLength = ParseContentLength(value); + } + return; + } + } + break; + case 15: { if ((((pUL[0] & 16140865742145839071uL) == 4984733066305160001uL) && ((pUI[2] & 3755991007u) == 1146045262u) && ((pUS[6] & 57311u) == 20041u) && ((pUB[14] & 223u) == 71u))) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { _headers._AcceptEncoding = AppendValue(_headers._AcceptEncoding, value); } else { - _bits |= 4194304L; + _bits |= 2097152L; _headers._AcceptEncoding = new StringValues(value); } return; @@ -5225,13 +5151,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16140865742145839071uL) == 5489136224570655553uL) && ((pUI[2] & 3755991007u) == 1430736449u) && ((pUS[6] & 57311u) == 18241u) && ((pUB[14] & 223u) == 69u))) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { _headers._AcceptLanguage = AppendValue(_headers._AcceptLanguage, value); } else { - _bits |= 8388608L; + _bits |= 4194304L; _headers._AcceptLanguage = new StringValues(value); } return; @@ -5243,13 +5169,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542893195231uL) == 5207098233614845513uL))) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { _headers._IfMatch = AppendValue(_headers._IfMatch, value); } else { - _bits |= 536870912L; + _bits |= 268435456L; _headers._IfMatch = new StringValues(value); } return; @@ -5257,13 +5183,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542893195231uL) == 4992044754422023753uL))) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { _headers._IfRange = AppendValue(_headers._IfRange, value); } else { - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._IfRange = new StringValues(value); } return; @@ -5275,13 +5201,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542893195231uL) == 4922237916571059785uL) && ((pUL[1] & 16131893727263186911uL) == 5283616559079179849uL) && ((pUS[8] & 57311u) == 17230u) && ((pUB[18] & 223u) == 69u))) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { _headers._IfUnmodifiedSince = AppendValue(_headers._IfUnmodifiedSince, value); } else { - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._IfUnmodifiedSince = new StringValues(value); } return; @@ -5289,13 +5215,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131893727263186911uL) == 6143241228466999888uL) && ((pUL[1] & 16131858542891098079uL) == 6071233043632179284uL) && ((pUS[8] & 57311u) == 20297u) && ((pUB[18] & 223u) == 78u))) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { _headers._ProxyAuthorization = AppendValue(_headers._ProxyAuthorization, value); } else { - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._ProxyAuthorization = new StringValues(value); } return; @@ -5307,13 +5233,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUS[0] & 57311u) == 17748u))) { - if (((_bits & 274877906944L) != 0)) + if (((_bits & 137438953472L) != 0)) { _headers._TE = AppendValue(_headers._TE, value); } else { - _bits |= 274877906944L; + _bits |= 137438953472L; _headers._TE = new StringValues(value); } return; @@ -5325,13 +5251,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542891098079uL) == 6071217693351039572uL) && ((pUB[8] & 223u) == 69u))) { - if (((_bits & 549755813888L) != 0)) + if (((_bits & 274877906944L) != 0)) { _headers._Translate = AppendValue(_headers._Translate, value); } else { - _bits |= 549755813888L; + _bits |= 274877906944L; _headers._Translate = new StringValues(value); } return; @@ -5343,13 +5269,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4840616791602578241uL) && ((pUL[1] & 16140865742145839071uL) == 5921472988629454415uL) && ((pUL[2] & 16140865742145839071uL) == 5561193831494668613uL) && ((pUI[6] & 3755991007u) == 1330140229u) && ((pUB[28] & 223u) == 68u))) { - if (((_bits & 4398046511104L) != 0)) + if (((_bits & 2199023255552L) != 0)) { _headers._AccessControlRequestMethod = AppendValue(_headers._AccessControlRequestMethod, value); } else { - _bits |= 4398046511104L; + _bits |= 2199023255552L; _headers._AccessControlRequestMethod = new StringValues(value); } return; @@ -5361,13 +5287,13 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4840616791602578241uL) && ((pUL[1] & 16140865742145839071uL) == 5921472988629454415uL) && ((pUL[2] & 16140865742145839071uL) == 5200905861305028933uL) && ((pUI[6] & 3755991007u) == 1162101061u) && ((pUS[14] & 57311u) == 21330u))) { - if (((_bits & 8796093022208L) != 0)) + if (((_bits & 4398046511104L) != 0)) { _headers._AccessControlRequestHeaders = AppendValue(_headers._AccessControlRequestHeaders, value); } else { - _bits |= 8796093022208L; + _bits |= 4398046511104L; _headers._AccessControlRequestHeaders = new StringValues(value); } return; @@ -5405,7 +5331,6 @@ private struct HeaderReferences public StringValues _Via; public StringValues _Warning; public StringValues _Allow; - public StringValues _ContentLength; public StringValues _ContentType; public StringValues _ContentEncoding; public StringValues _ContentLanguage; @@ -5448,138 +5373,137 @@ public bool MoveNext() switch (_state) { - case 0: - goto state0; + case 0: + goto state0; - case 1: - goto state1; + case 1: + goto state1; - case 2: - goto state2; - - case 3: - goto state3; + case 2: + goto state2; - case 4: - goto state4; + case 3: + goto state3; - case 5: - goto state5; + case 4: + goto state4; - case 6: - goto state6; + case 5: + goto state5; - case 7: - goto state7; + case 6: + goto state6; - case 8: - goto state8; + case 7: + goto state7; - case 9: - goto state9; + case 8: + goto state8; - case 10: - goto state10; + case 9: + goto state9; - case 11: - goto state11; + case 10: + goto state10; - case 12: - goto state12; + case 11: + goto state11; - case 13: - goto state13; + case 12: + goto state12; - case 14: - goto state14; + case 13: + goto state13; - case 15: - goto state15; + case 14: + goto state14; - case 16: - goto state16; + case 15: + goto state15; - case 17: - goto state17; + case 16: + goto state16; - case 18: - goto state18; + case 17: + goto state17; - case 19: - goto state19; + case 18: + goto state18; - case 20: - goto state20; + case 19: + goto state19; - case 21: - goto state21; + case 20: + goto state20; - case 22: - goto state22; + case 21: + goto state21; - case 23: - goto state23; + case 22: + goto state22; - case 24: - goto state24; + case 23: + goto state23; - case 25: - goto state25; + case 24: + goto state24; - case 26: - goto state26; + case 25: + goto state25; - case 27: - goto state27; + case 26: + goto state26; - case 28: - goto state28; + case 27: + goto state27; - case 29: - goto state29; + case 28: + goto state28; - case 30: - goto state30; + case 29: + goto state29; - case 31: - goto state31; + case 30: + goto state30; - case 32: - goto state32; + case 31: + goto state31; - case 33: - goto state33; + case 32: + goto state32; - case 34: - goto state34; + case 33: + goto state33; - case 35: - goto state35; + case 34: + goto state34; - case 36: - goto state36; + case 35: + goto state35; - case 37: - goto state37; + case 36: + goto state36; - case 38: - goto state38; + case 37: + goto state37; - case 39: - goto state39; + case 38: + goto state38; - case 40: - goto state40; + case 39: + goto state39; - case 41: - goto state41; + case 40: + goto state40; - case 42: - goto state42; + case 41: + goto state41; - case 43: - goto state43; + case 42: + goto state42; + case 44: + goto state44; default: goto state_default; } @@ -5675,7 +5599,7 @@ public bool MoveNext() state11: if (((_bits & 2048L) != 0)) { - _current = new KeyValuePair("Content-Length", _collection._headers._ContentLength); + _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); _state = 12; return true; } @@ -5683,7 +5607,7 @@ public bool MoveNext() state12: if (((_bits & 4096L) != 0)) { - _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); + _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); _state = 13; return true; } @@ -5691,7 +5615,7 @@ public bool MoveNext() state13: if (((_bits & 8192L) != 0)) { - _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); + _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); _state = 14; return true; } @@ -5699,7 +5623,7 @@ public bool MoveNext() state14: if (((_bits & 16384L) != 0)) { - _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); + _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); _state = 15; return true; } @@ -5707,7 +5631,7 @@ public bool MoveNext() state15: if (((_bits & 32768L) != 0)) { - _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); + _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); _state = 16; return true; } @@ -5715,7 +5639,7 @@ public bool MoveNext() state16: if (((_bits & 65536L) != 0)) { - _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); + _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); _state = 17; return true; } @@ -5723,7 +5647,7 @@ public bool MoveNext() state17: if (((_bits & 131072L) != 0)) { - _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); + _current = new KeyValuePair("Expires", _collection._headers._Expires); _state = 18; return true; } @@ -5731,7 +5655,7 @@ public bool MoveNext() state18: if (((_bits & 262144L) != 0)) { - _current = new KeyValuePair("Expires", _collection._headers._Expires); + _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); _state = 19; return true; } @@ -5739,7 +5663,7 @@ public bool MoveNext() state19: if (((_bits & 524288L) != 0)) { - _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); + _current = new KeyValuePair("Accept", _collection._headers._Accept); _state = 20; return true; } @@ -5747,7 +5671,7 @@ public bool MoveNext() state20: if (((_bits & 1048576L) != 0)) { - _current = new KeyValuePair("Accept", _collection._headers._Accept); + _current = new KeyValuePair("Accept-Charset", _collection._headers._AcceptCharset); _state = 21; return true; } @@ -5755,7 +5679,7 @@ public bool MoveNext() state21: if (((_bits & 2097152L) != 0)) { - _current = new KeyValuePair("Accept-Charset", _collection._headers._AcceptCharset); + _current = new KeyValuePair("Accept-Encoding", _collection._headers._AcceptEncoding); _state = 22; return true; } @@ -5763,7 +5687,7 @@ public bool MoveNext() state22: if (((_bits & 4194304L) != 0)) { - _current = new KeyValuePair("Accept-Encoding", _collection._headers._AcceptEncoding); + _current = new KeyValuePair("Accept-Language", _collection._headers._AcceptLanguage); _state = 23; return true; } @@ -5771,7 +5695,7 @@ public bool MoveNext() state23: if (((_bits & 8388608L) != 0)) { - _current = new KeyValuePair("Accept-Language", _collection._headers._AcceptLanguage); + _current = new KeyValuePair("Authorization", _collection._headers._Authorization); _state = 24; return true; } @@ -5779,7 +5703,7 @@ public bool MoveNext() state24: if (((_bits & 16777216L) != 0)) { - _current = new KeyValuePair("Authorization", _collection._headers._Authorization); + _current = new KeyValuePair("Cookie", _collection._headers._Cookie); _state = 25; return true; } @@ -5787,7 +5711,7 @@ public bool MoveNext() state25: if (((_bits & 33554432L) != 0)) { - _current = new KeyValuePair("Cookie", _collection._headers._Cookie); + _current = new KeyValuePair("Expect", _collection._headers._Expect); _state = 26; return true; } @@ -5795,7 +5719,7 @@ public bool MoveNext() state26: if (((_bits & 67108864L) != 0)) { - _current = new KeyValuePair("Expect", _collection._headers._Expect); + _current = new KeyValuePair("From", _collection._headers._From); _state = 27; return true; } @@ -5803,7 +5727,7 @@ public bool MoveNext() state27: if (((_bits & 134217728L) != 0)) { - _current = new KeyValuePair("From", _collection._headers._From); + _current = new KeyValuePair("Host", _collection._headers._Host); _state = 28; return true; } @@ -5811,7 +5735,7 @@ public bool MoveNext() state28: if (((_bits & 268435456L) != 0)) { - _current = new KeyValuePair("Host", _collection._headers._Host); + _current = new KeyValuePair("If-Match", _collection._headers._IfMatch); _state = 29; return true; } @@ -5819,7 +5743,7 @@ public bool MoveNext() state29: if (((_bits & 536870912L) != 0)) { - _current = new KeyValuePair("If-Match", _collection._headers._IfMatch); + _current = new KeyValuePair("If-Modified-Since", _collection._headers._IfModifiedSince); _state = 30; return true; } @@ -5827,7 +5751,7 @@ public bool MoveNext() state30: if (((_bits & 1073741824L) != 0)) { - _current = new KeyValuePair("If-Modified-Since", _collection._headers._IfModifiedSince); + _current = new KeyValuePair("If-None-Match", _collection._headers._IfNoneMatch); _state = 31; return true; } @@ -5835,7 +5759,7 @@ public bool MoveNext() state31: if (((_bits & 2147483648L) != 0)) { - _current = new KeyValuePair("If-None-Match", _collection._headers._IfNoneMatch); + _current = new KeyValuePair("If-Range", _collection._headers._IfRange); _state = 32; return true; } @@ -5843,7 +5767,7 @@ public bool MoveNext() state32: if (((_bits & 4294967296L) != 0)) { - _current = new KeyValuePair("If-Range", _collection._headers._IfRange); + _current = new KeyValuePair("If-Unmodified-Since", _collection._headers._IfUnmodifiedSince); _state = 33; return true; } @@ -5851,7 +5775,7 @@ public bool MoveNext() state33: if (((_bits & 8589934592L) != 0)) { - _current = new KeyValuePair("If-Unmodified-Since", _collection._headers._IfUnmodifiedSince); + _current = new KeyValuePair("Max-Forwards", _collection._headers._MaxForwards); _state = 34; return true; } @@ -5859,7 +5783,7 @@ public bool MoveNext() state34: if (((_bits & 17179869184L) != 0)) { - _current = new KeyValuePair("Max-Forwards", _collection._headers._MaxForwards); + _current = new KeyValuePair("Proxy-Authorization", _collection._headers._ProxyAuthorization); _state = 35; return true; } @@ -5867,7 +5791,7 @@ public bool MoveNext() state35: if (((_bits & 34359738368L) != 0)) { - _current = new KeyValuePair("Proxy-Authorization", _collection._headers._ProxyAuthorization); + _current = new KeyValuePair("Referer", _collection._headers._Referer); _state = 36; return true; } @@ -5875,7 +5799,7 @@ public bool MoveNext() state36: if (((_bits & 68719476736L) != 0)) { - _current = new KeyValuePair("Referer", _collection._headers._Referer); + _current = new KeyValuePair("Range", _collection._headers._Range); _state = 37; return true; } @@ -5883,7 +5807,7 @@ public bool MoveNext() state37: if (((_bits & 137438953472L) != 0)) { - _current = new KeyValuePair("Range", _collection._headers._Range); + _current = new KeyValuePair("TE", _collection._headers._TE); _state = 38; return true; } @@ -5891,7 +5815,7 @@ public bool MoveNext() state38: if (((_bits & 274877906944L) != 0)) { - _current = new KeyValuePair("TE", _collection._headers._TE); + _current = new KeyValuePair("Translate", _collection._headers._Translate); _state = 39; return true; } @@ -5899,7 +5823,7 @@ public bool MoveNext() state39: if (((_bits & 549755813888L) != 0)) { - _current = new KeyValuePair("Translate", _collection._headers._Translate); + _current = new KeyValuePair("User-Agent", _collection._headers._UserAgent); _state = 40; return true; } @@ -5907,7 +5831,7 @@ public bool MoveNext() state40: if (((_bits & 1099511627776L) != 0)) { - _current = new KeyValuePair("User-Agent", _collection._headers._UserAgent); + _current = new KeyValuePair("Origin", _collection._headers._Origin); _state = 41; return true; } @@ -5915,7 +5839,7 @@ public bool MoveNext() state41: if (((_bits & 2199023255552L) != 0)) { - _current = new KeyValuePair("Origin", _collection._headers._Origin); + _current = new KeyValuePair("Access-Control-Request-Method", _collection._headers._AccessControlRequestMethod); _state = 42; return true; } @@ -5923,19 +5847,18 @@ public bool MoveNext() state42: if (((_bits & 4398046511104L) != 0)) { - _current = new KeyValuePair("Access-Control-Request-Method", _collection._headers._AccessControlRequestMethod); + _current = new KeyValuePair("Access-Control-Request-Headers", _collection._headers._AccessControlRequestHeaders); _state = 43; return true; } - state43: - if (((_bits & 8796093022208L) != 0)) + state44: + if (_collection.ContentLength.HasValue) { - _current = new KeyValuePair("Access-Control-Request-Headers", _collection._headers._AccessControlRequestHeaders); - _state = 44; + _current = new KeyValuePair("Content-Length", _collection.ContentLength.ToString()); + _state = 45; return true; } - state_default: if (!_hasUnknown || !_unknownEnumerator.MoveNext()) { @@ -5952,7 +5875,7 @@ public partial class FrameResponseHeaders { private static byte[] _headerBytes = new byte[] { - 13,10,67,97,99,104,101,45,67,111,110,116,114,111,108,58,32,13,10,67,111,110,110,101,99,116,105,111,110,58,32,13,10,68,97,116,101,58,32,13,10,75,101,101,112,45,65,108,105,118,101,58,32,13,10,80,114,97,103,109,97,58,32,13,10,84,114,97,105,108,101,114,58,32,13,10,84,114,97,110,115,102,101,114,45,69,110,99,111,100,105,110,103,58,32,13,10,85,112,103,114,97,100,101,58,32,13,10,86,105,97,58,32,13,10,87,97,114,110,105,110,103,58,32,13,10,65,108,108,111,119,58,32,13,10,67,111,110,116,101,110,116,45,76,101,110,103,116,104,58,32,13,10,67,111,110,116,101,110,116,45,84,121,112,101,58,32,13,10,67,111,110,116,101,110,116,45,69,110,99,111,100,105,110,103,58,32,13,10,67,111,110,116,101,110,116,45,76,97,110,103,117,97,103,101,58,32,13,10,67,111,110,116,101,110,116,45,76,111,99,97,116,105,111,110,58,32,13,10,67,111,110,116,101,110,116,45,77,68,53,58,32,13,10,67,111,110,116,101,110,116,45,82,97,110,103,101,58,32,13,10,69,120,112,105,114,101,115,58,32,13,10,76,97,115,116,45,77,111,100,105,102,105,101,100,58,32,13,10,65,99,99,101,112,116,45,82,97,110,103,101,115,58,32,13,10,65,103,101,58,32,13,10,69,84,97,103,58,32,13,10,76,111,99,97,116,105,111,110,58,32,13,10,80,114,111,120,121,45,65,117,116,104,101,110,116,105,99,97,116,101,58,32,13,10,82,101,116,114,121,45,65,102,116,101,114,58,32,13,10,83,101,114,118,101,114,58,32,13,10,83,101,116,45,67,111,111,107,105,101,58,32,13,10,86,97,114,121,58,32,13,10,87,87,87,45,65,117,116,104,101,110,116,105,99,97,116,101,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,67,114,101,100,101,110,116,105,97,108,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,72,101,97,100,101,114,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,77,101,116,104,111,100,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,79,114,105,103,105,110,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,69,120,112,111,115,101,45,72,101,97,100,101,114,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,77,97,120,45,65,103,101,58,32, + 13,10,67,97,99,104,101,45,67,111,110,116,114,111,108,58,32,13,10,67,111,110,110,101,99,116,105,111,110,58,32,13,10,68,97,116,101,58,32,13,10,75,101,101,112,45,65,108,105,118,101,58,32,13,10,80,114,97,103,109,97,58,32,13,10,84,114,97,105,108,101,114,58,32,13,10,84,114,97,110,115,102,101,114,45,69,110,99,111,100,105,110,103,58,32,13,10,85,112,103,114,97,100,101,58,32,13,10,86,105,97,58,32,13,10,87,97,114,110,105,110,103,58,32,13,10,65,108,108,111,119,58,32,13,10,67,111,110,116,101,110,116,45,84,121,112,101,58,32,13,10,67,111,110,116,101,110,116,45,69,110,99,111,100,105,110,103,58,32,13,10,67,111,110,116,101,110,116,45,76,97,110,103,117,97,103,101,58,32,13,10,67,111,110,116,101,110,116,45,76,111,99,97,116,105,111,110,58,32,13,10,67,111,110,116,101,110,116,45,77,68,53,58,32,13,10,67,111,110,116,101,110,116,45,82,97,110,103,101,58,32,13,10,69,120,112,105,114,101,115,58,32,13,10,76,97,115,116,45,77,111,100,105,102,105,101,100,58,32,13,10,65,99,99,101,112,116,45,82,97,110,103,101,115,58,32,13,10,65,103,101,58,32,13,10,69,84,97,103,58,32,13,10,76,111,99,97,116,105,111,110,58,32,13,10,80,114,111,120,121,45,65,117,116,104,101,110,116,105,99,97,116,101,58,32,13,10,82,101,116,114,121,45,65,102,116,101,114,58,32,13,10,83,101,114,118,101,114,58,32,13,10,83,101,116,45,67,111,111,107,105,101,58,32,13,10,86,97,114,121,58,32,13,10,87,87,87,45,65,117,116,104,101,110,116,105,99,97,116,101,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,67,114,101,100,101,110,116,105,97,108,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,72,101,97,100,101,114,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,77,101,116,104,111,100,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,65,108,108,111,119,45,79,114,105,103,105,110,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,69,120,112,111,115,101,45,72,101,97,100,101,114,115,58,32,13,10,65,99,99,101,115,115,45,67,111,110,116,114,111,108,45,77,97,120,45,65,103,101,58,32,13,10,67,111,110,116,101,110,116,45,76,101,110,103,116,104,58,32, }; private long _bits = 0; @@ -6137,29 +6060,11 @@ public StringValues HeaderAllow _headers._Allow = value; } } - public StringValues HeaderContentLength - { - get - { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentLength; - } - return StringValues.Empty; - } - set - { - _contentLength = ParseContentLength(value); - _bits |= 2048L; - _headers._ContentLength = value; - _headers._rawContentLength = null; - } - } public StringValues HeaderContentType { get { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { return _headers._ContentType; } @@ -6167,7 +6072,7 @@ public StringValues HeaderContentType } set { - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = value; } } @@ -6175,7 +6080,7 @@ public StringValues HeaderContentEncoding { get { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { return _headers._ContentEncoding; } @@ -6183,7 +6088,7 @@ public StringValues HeaderContentEncoding } set { - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = value; } } @@ -6191,7 +6096,7 @@ public StringValues HeaderContentLanguage { get { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { return _headers._ContentLanguage; } @@ -6199,7 +6104,7 @@ public StringValues HeaderContentLanguage } set { - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = value; } } @@ -6207,7 +6112,7 @@ public StringValues HeaderContentLocation { get { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { return _headers._ContentLocation; } @@ -6215,7 +6120,7 @@ public StringValues HeaderContentLocation } set { - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = value; } } @@ -6223,7 +6128,7 @@ public StringValues HeaderContentMD5 { get { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { return _headers._ContentMD5; } @@ -6231,7 +6136,7 @@ public StringValues HeaderContentMD5 } set { - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = value; } } @@ -6239,7 +6144,7 @@ public StringValues HeaderContentRange { get { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { return _headers._ContentRange; } @@ -6247,7 +6152,7 @@ public StringValues HeaderContentRange } set { - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; } } @@ -6255,7 +6160,7 @@ public StringValues HeaderExpires { get { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { return _headers._Expires; } @@ -6263,7 +6168,7 @@ public StringValues HeaderExpires } set { - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; } } @@ -6271,7 +6176,7 @@ public StringValues HeaderLastModified { get { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { return _headers._LastModified; } @@ -6279,7 +6184,7 @@ public StringValues HeaderLastModified } set { - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; } } @@ -6287,7 +6192,7 @@ public StringValues HeaderAcceptRanges { get { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { return _headers._AcceptRanges; } @@ -6295,7 +6200,7 @@ public StringValues HeaderAcceptRanges } set { - _bits |= 1048576L; + _bits |= 524288L; _headers._AcceptRanges = value; } } @@ -6303,7 +6208,7 @@ public StringValues HeaderAge { get { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { return _headers._Age; } @@ -6311,7 +6216,7 @@ public StringValues HeaderAge } set { - _bits |= 2097152L; + _bits |= 1048576L; _headers._Age = value; } } @@ -6319,7 +6224,7 @@ public StringValues HeaderETag { get { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { return _headers._ETag; } @@ -6327,7 +6232,7 @@ public StringValues HeaderETag } set { - _bits |= 4194304L; + _bits |= 2097152L; _headers._ETag = value; } } @@ -6335,7 +6240,7 @@ public StringValues HeaderLocation { get { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { return _headers._Location; } @@ -6343,7 +6248,7 @@ public StringValues HeaderLocation } set { - _bits |= 8388608L; + _bits |= 4194304L; _headers._Location = value; } } @@ -6351,7 +6256,7 @@ public StringValues HeaderProxyAuthenticate { get { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { return _headers._ProxyAuthenticate; } @@ -6359,7 +6264,7 @@ public StringValues HeaderProxyAuthenticate } set { - _bits |= 16777216L; + _bits |= 8388608L; _headers._ProxyAuthenticate = value; } } @@ -6367,7 +6272,7 @@ public StringValues HeaderRetryAfter { get { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { return _headers._RetryAfter; } @@ -6375,7 +6280,7 @@ public StringValues HeaderRetryAfter } set { - _bits |= 33554432L; + _bits |= 16777216L; _headers._RetryAfter = value; } } @@ -6383,7 +6288,7 @@ public StringValues HeaderServer { get { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { return _headers._Server; } @@ -6391,7 +6296,7 @@ public StringValues HeaderServer } set { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Server = value; _headers._rawServer = null; } @@ -6400,7 +6305,7 @@ public StringValues HeaderSetCookie { get { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { return _headers._SetCookie; } @@ -6408,7 +6313,7 @@ public StringValues HeaderSetCookie } set { - _bits |= 134217728L; + _bits |= 67108864L; _headers._SetCookie = value; } } @@ -6416,7 +6321,7 @@ public StringValues HeaderVary { get { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { return _headers._Vary; } @@ -6424,7 +6329,7 @@ public StringValues HeaderVary } set { - _bits |= 268435456L; + _bits |= 134217728L; _headers._Vary = value; } } @@ -6432,7 +6337,7 @@ public StringValues HeaderWWWAuthenticate { get { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { return _headers._WWWAuthenticate; } @@ -6440,7 +6345,7 @@ public StringValues HeaderWWWAuthenticate } set { - _bits |= 536870912L; + _bits |= 268435456L; _headers._WWWAuthenticate = value; } } @@ -6448,7 +6353,7 @@ public StringValues HeaderAccessControlAllowCredentials { get { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { return _headers._AccessControlAllowCredentials; } @@ -6456,7 +6361,7 @@ public StringValues HeaderAccessControlAllowCredentials } set { - _bits |= 1073741824L; + _bits |= 536870912L; _headers._AccessControlAllowCredentials = value; } } @@ -6464,7 +6369,7 @@ public StringValues HeaderAccessControlAllowHeaders { get { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { return _headers._AccessControlAllowHeaders; } @@ -6472,7 +6377,7 @@ public StringValues HeaderAccessControlAllowHeaders } set { - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._AccessControlAllowHeaders = value; } } @@ -6480,7 +6385,7 @@ public StringValues HeaderAccessControlAllowMethods { get { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { return _headers._AccessControlAllowMethods; } @@ -6488,7 +6393,7 @@ public StringValues HeaderAccessControlAllowMethods } set { - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._AccessControlAllowMethods = value; } } @@ -6496,7 +6401,7 @@ public StringValues HeaderAccessControlAllowOrigin { get { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { return _headers._AccessControlAllowOrigin; } @@ -6504,7 +6409,7 @@ public StringValues HeaderAccessControlAllowOrigin } set { - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._AccessControlAllowOrigin = value; } } @@ -6512,7 +6417,7 @@ public StringValues HeaderAccessControlExposeHeaders { get { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { return _headers._AccessControlExposeHeaders; } @@ -6520,7 +6425,7 @@ public StringValues HeaderAccessControlExposeHeaders } set { - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._AccessControlExposeHeaders = value; } } @@ -6528,7 +6433,7 @@ public StringValues HeaderAccessControlMaxAge { get { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { return _headers._AccessControlMaxAge; } @@ -6536,10 +6441,25 @@ public StringValues HeaderAccessControlMaxAge } set { - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._AccessControlMaxAge = value; } } + public StringValues HeaderContentLength + { + get + { + if (ContentLength.HasValue) + { + return ContentLength.ToString(); + } + return StringValues.Empty; + } + set + { + ContentLength = ParseContentLength(value); + } + } public void SetRawConnection(StringValues value, byte[] raw) { @@ -6559,22 +6479,15 @@ public void SetRawTransferEncoding(StringValues value, byte[] raw) _headers._TransferEncoding = value; _headers._rawTransferEncoding = raw; } - public void SetRawContentLength(StringValues value, byte[] raw) - { - _contentLength = ParseContentLength(value); - _bits |= 2048L; - _headers._ContentLength = value; - _headers._rawContentLength = raw; - } public void SetRawServer(StringValues value, byte[] raw) { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Server = value; _headers._rawServer = raw; } protected override int GetCountFast() { - return BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } protected override StringValues GetValueFast(string key) { @@ -6596,7 +6509,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { return _headers._ContentRange; } @@ -6608,7 +6521,7 @@ protected override StringValues GetValueFast(string key) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { return _headers._LastModified; } @@ -6620,7 +6533,7 @@ protected override StringValues GetValueFast(string key) if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { return _headers._AcceptRanges; } @@ -6631,7 +6544,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6660,7 +6572,7 @@ protected override StringValues GetValueFast(string key) if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { return _headers._SetCookie; } @@ -6671,7 +6583,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6688,7 +6599,7 @@ protected override StringValues GetValueFast(string key) if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { return _headers._ETag; } @@ -6700,7 +6611,7 @@ protected override StringValues GetValueFast(string key) if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { return _headers._Vary; } @@ -6711,7 +6622,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6728,7 +6638,7 @@ protected override StringValues GetValueFast(string key) if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { return _headers._Server; } @@ -6739,7 +6649,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6780,7 +6689,7 @@ protected override StringValues GetValueFast(string key) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { return _headers._Expires; } @@ -6791,7 +6700,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6807,7 +6715,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6824,7 +6731,7 @@ protected override StringValues GetValueFast(string key) if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { return _headers._Age; } @@ -6835,7 +6742,6 @@ protected override StringValues GetValueFast(string key) } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -6851,28 +6757,11 @@ protected override StringValues GetValueFast(string key) } } break; - - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentLength; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { return _headers._ContentType; } @@ -6883,12 +6772,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { return _headers._ContentEncoding; } @@ -6900,7 +6788,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { return _headers._ContentLanguage; } @@ -6912,7 +6800,7 @@ protected override StringValues GetValueFast(string key) if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { return _headers._ContentLocation; } @@ -6924,7 +6812,7 @@ protected override StringValues GetValueFast(string key) if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { return _headers._WWWAuthenticate; } @@ -6935,12 +6823,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { return _headers._ContentMD5; } @@ -6952,7 +6839,7 @@ protected override StringValues GetValueFast(string key) if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { return _headers._RetryAfter; } @@ -6963,12 +6850,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 8: { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { return _headers._Location; } @@ -6979,12 +6865,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 18: { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { return _headers._ProxyAuthenticate; } @@ -6995,12 +6880,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 32: { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { return _headers._AccessControlAllowCredentials; } @@ -7011,12 +6895,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 28: { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { return _headers._AccessControlAllowHeaders; } @@ -7028,7 +6911,7 @@ protected override StringValues GetValueFast(string key) if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { return _headers._AccessControlAllowMethods; } @@ -7039,12 +6922,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 27: { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { return _headers._AccessControlAllowOrigin; } @@ -7055,12 +6937,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 29: { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { return _headers._AccessControlExposeHeaders; } @@ -7071,12 +6952,11 @@ protected override StringValues GetValueFast(string key) } } break; - case 22: { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { return _headers._AccessControlMaxAge; } @@ -7087,7 +6967,22 @@ protected override StringValues GetValueFast(string key) } } break; -} + case 14: + { + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (ContentLength.HasValue) + { + return ContentLength.ToString(); + } + else + { + ThrowKeyNotFoundException(); + } + } + } + break; + } if (MaybeUnknown == null) { ThrowKeyNotFoundException(); @@ -7116,7 +7011,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { value = _headers._ContentRange; return true; @@ -7130,7 +7025,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { value = _headers._LastModified; return true; @@ -7144,7 +7039,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { value = _headers._AcceptRanges; return true; @@ -7190,7 +7085,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { value = _headers._SetCookie; return true; @@ -7222,7 +7117,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { value = _headers._ETag; return true; @@ -7236,7 +7131,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { value = _headers._Vary; return true; @@ -7268,7 +7163,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { value = _headers._Server; return true; @@ -7328,7 +7223,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { value = _headers._Expires; return true; @@ -7378,7 +7273,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { value = _headers._Age; return true; @@ -7396,27 +7291,9 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) - { - value = _headers._Allow; - return true; - } - else - { - value = StringValues.Empty; - return false; - } - } - } - break; - - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) + if (((_bits & 1024L) != 0)) { - value = _headers._ContentLength; + value = _headers._Allow; return true; } else @@ -7432,7 +7309,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { value = _headers._ContentType; return true; @@ -7450,7 +7327,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { value = _headers._ContentEncoding; return true; @@ -7464,7 +7341,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { value = _headers._ContentLanguage; return true; @@ -7478,7 +7355,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { value = _headers._ContentLocation; return true; @@ -7492,7 +7369,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { value = _headers._WWWAuthenticate; return true; @@ -7510,7 +7387,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { value = _headers._ContentMD5; return true; @@ -7524,7 +7401,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { value = _headers._RetryAfter; return true; @@ -7542,7 +7419,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { value = _headers._Location; return true; @@ -7560,7 +7437,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { value = _headers._ProxyAuthenticate; return true; @@ -7578,7 +7455,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { value = _headers._AccessControlAllowCredentials; return true; @@ -7596,7 +7473,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { value = _headers._AccessControlAllowHeaders; return true; @@ -7610,7 +7487,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { value = _headers._AccessControlAllowMethods; return true; @@ -7628,7 +7505,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { value = _headers._AccessControlAllowOrigin; return true; @@ -7646,7 +7523,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { value = _headers._AccessControlExposeHeaders; return true; @@ -7664,7 +7541,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { value = _headers._AccessControlMaxAge; return true; @@ -7677,6 +7554,24 @@ protected override bool TryGetValueFast(string key, out StringValues value) } } break; + + case 14: + { + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (ContentLength.HasValue) + { + value = ContentLength.ToString(); + return true; + } + else + { + value = StringValues.Empty; + return false; + } + } + } + break; } value = StringValues.Empty; return MaybeUnknown?.TryGetValue(key, out value) ?? false; @@ -7697,21 +7592,21 @@ protected override void SetValueFast(string key, StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; return; } if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; return; } if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1048576L; + _bits |= 524288L; _headers._AcceptRanges = value; return; } @@ -7737,7 +7632,7 @@ protected override void SetValueFast(string key, StringValues value) if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 134217728L; + _bits |= 67108864L; _headers._SetCookie = value; return; } @@ -7756,14 +7651,14 @@ protected override void SetValueFast(string key, StringValues value) if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4194304L; + _bits |= 2097152L; _headers._ETag = value; return; } if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 268435456L; + _bits |= 134217728L; _headers._Vary = value; return; } @@ -7781,7 +7676,7 @@ protected override void SetValueFast(string key, StringValues value) if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 67108864L; + _bits |= 33554432L; _headers._Server = value; _headers._rawServer = null; return; @@ -7814,7 +7709,7 @@ protected override void SetValueFast(string key, StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; return; } @@ -7844,7 +7739,7 @@ protected override void SetValueFast(string key, StringValues value) if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2097152L; + _bits |= 1048576L; _headers._Age = value; return; } @@ -7862,24 +7757,11 @@ protected override void SetValueFast(string key, StringValues value) } break; - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - _contentLength = ParseContentLength(value); - _bits |= 2048L; - _headers._ContentLength = value; - _headers._rawContentLength = null; - return; - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = value; return; } @@ -7890,28 +7772,28 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = value; return; } if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = value; return; } if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = value; return; } if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 536870912L; + _bits |= 268435456L; _headers._WWWAuthenticate = value; return; } @@ -7922,14 +7804,14 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = value; return; } if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 33554432L; + _bits |= 16777216L; _headers._RetryAfter = value; return; } @@ -7940,7 +7822,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8388608L; + _bits |= 4194304L; _headers._Location = value; return; } @@ -7951,7 +7833,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16777216L; + _bits |= 8388608L; _headers._ProxyAuthenticate = value; return; } @@ -7962,7 +7844,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1073741824L; + _bits |= 536870912L; _headers._AccessControlAllowCredentials = value; return; } @@ -7973,14 +7855,14 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._AccessControlAllowHeaders = value; return; } if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._AccessControlAllowMethods = value; return; } @@ -7991,7 +7873,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._AccessControlAllowOrigin = value; return; } @@ -8002,7 +7884,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._AccessControlExposeHeaders = value; return; } @@ -8013,12 +7895,22 @@ protected override void SetValueFast(string key, StringValues value) { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._AccessControlMaxAge = value; return; } } break; + + case 14: + { + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + ContentLength = ParseContentLength(value); + return; + } + } + break; } ValidateHeaderCharacters(key); Unknown[key] = value; @@ -8043,33 +7935,33 @@ protected override void AddValueFast(string key, StringValues value) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 131072L; + _bits |= 65536L; _headers._ContentRange = value; return; } if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 524288L; + _bits |= 262144L; _headers._LastModified = value; return; } if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 1048576L; + _bits |= 524288L; _headers._AcceptRanges = value; return; } @@ -8103,11 +7995,11 @@ protected override void AddValueFast(string key, StringValues value) if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 134217728L; + _bits |= 67108864L; _headers._SetCookie = value; return; } @@ -8130,22 +8022,22 @@ protected override void AddValueFast(string key, StringValues value) if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4194304L; + _bits |= 2097152L; _headers._ETag = value; return; } if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 268435456L; + _bits |= 134217728L; _headers._Vary = value; return; } @@ -8167,11 +8059,11 @@ protected override void AddValueFast(string key, StringValues value) if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 67108864L; + _bits |= 33554432L; _headers._Server = value; _headers._rawServer = null; return; @@ -8216,11 +8108,11 @@ protected override void AddValueFast(string key, StringValues value) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 262144L; + _bits |= 131072L; _headers._Expires = value; return; } @@ -8258,11 +8150,11 @@ protected override void AddValueFast(string key, StringValues value) if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 2097152L; + _bits |= 1048576L; _headers._Age = value; return; } @@ -8284,32 +8176,15 @@ protected override void AddValueFast(string key, StringValues value) } break; - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - ThrowDuplicateKeyException(); - } - _contentLength = ParseContentLength(value); - _bits |= 2048L; - _headers._ContentLength = value; - _headers._rawContentLength = null; - return; - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4096L; + _bits |= 2048L; _headers._ContentType = value; return; } @@ -8320,44 +8195,44 @@ protected override void AddValueFast(string key, StringValues value) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8192L; + _bits |= 4096L; _headers._ContentEncoding = value; return; } if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 16384L; + _bits |= 8192L; _headers._ContentLanguage = value; return; } if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 32768L; + _bits |= 16384L; _headers._ContentLocation = value; return; } if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 536870912L; + _bits |= 268435456L; _headers._WWWAuthenticate = value; return; } @@ -8368,22 +8243,22 @@ protected override void AddValueFast(string key, StringValues value) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 65536L; + _bits |= 32768L; _headers._ContentMD5 = value; return; } if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 33554432L; + _bits |= 16777216L; _headers._RetryAfter = value; return; } @@ -8394,11 +8269,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8388608L; + _bits |= 4194304L; _headers._Location = value; return; } @@ -8409,11 +8284,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 16777216L; + _bits |= 8388608L; _headers._ProxyAuthenticate = value; return; } @@ -8424,11 +8299,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 1073741824L; + _bits |= 536870912L; _headers._AccessControlAllowCredentials = value; return; } @@ -8439,22 +8314,22 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 2147483648L; + _bits |= 1073741824L; _headers._AccessControlAllowHeaders = value; return; } if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 4294967296L; + _bits |= 2147483648L; _headers._AccessControlAllowMethods = value; return; } @@ -8465,11 +8340,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 8589934592L; + _bits |= 4294967296L; _headers._AccessControlAllowOrigin = value; return; } @@ -8480,11 +8355,11 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 17179869184L; + _bits |= 8589934592L; _headers._AccessControlExposeHeaders = value; return; } @@ -8495,16 +8370,33 @@ protected override void AddValueFast(string key, StringValues value) { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { ThrowDuplicateKeyException(); } - _bits |= 34359738368L; + _bits |= 17179869184L; _headers._AccessControlMaxAge = value; return; } } break; + + case 14: + { + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (ContentLength.HasValue) + { + ThrowDuplicateKeyException(); + } + else + { + ContentLength = ParseContentLength(value); + } + return; + } + } + break; } ValidateHeaderCharacters(key); Unknown.Add(key, value); @@ -8531,9 +8423,9 @@ protected override bool RemoveFast(string key) if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if (((_bits & 65536L) != 0)) { - _bits &= ~131072L; + _bits &= ~65536L; _headers._ContentRange = StringValues.Empty; return true; } @@ -8545,9 +8437,9 @@ protected override bool RemoveFast(string key) if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if (((_bits & 262144L) != 0)) { - _bits &= ~524288L; + _bits &= ~262144L; _headers._LastModified = StringValues.Empty; return true; } @@ -8559,9 +8451,9 @@ protected override bool RemoveFast(string key) if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if (((_bits & 524288L) != 0)) { - _bits &= ~1048576L; + _bits &= ~524288L; _headers._AcceptRanges = StringValues.Empty; return true; } @@ -8606,9 +8498,9 @@ protected override bool RemoveFast(string key) if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if (((_bits & 67108864L) != 0)) { - _bits &= ~134217728L; + _bits &= ~67108864L; _headers._SetCookie = StringValues.Empty; return true; } @@ -8639,9 +8531,9 @@ protected override bool RemoveFast(string key) if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if (((_bits & 2097152L) != 0)) { - _bits &= ~4194304L; + _bits &= ~2097152L; _headers._ETag = StringValues.Empty; return true; } @@ -8653,9 +8545,9 @@ protected override bool RemoveFast(string key) if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if (((_bits & 134217728L) != 0)) { - _bits &= ~268435456L; + _bits &= ~134217728L; _headers._Vary = StringValues.Empty; return true; } @@ -8685,9 +8577,9 @@ protected override bool RemoveFast(string key) if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { - _bits &= ~67108864L; + _bits &= ~33554432L; _headers._Server = StringValues.Empty; _headers._rawServer = null; return true; @@ -8746,9 +8638,9 @@ protected override bool RemoveFast(string key) if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if (((_bits & 131072L) != 0)) { - _bits &= ~262144L; + _bits &= ~131072L; _headers._Expires = StringValues.Empty; return true; } @@ -8797,9 +8689,9 @@ protected override bool RemoveFast(string key) if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if (((_bits & 1048576L) != 0)) { - _bits &= ~2097152L; + _bits &= ~1048576L; _headers._Age = StringValues.Empty; return true; } @@ -8829,33 +8721,13 @@ protected override bool RemoveFast(string key) } break; - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - _contentLength = null; - _bits &= ~2048L; - _headers._ContentLength = StringValues.Empty; - _headers._rawContentLength = null; - return true; - } - else - { - return false; - } - } - } - break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if (((_bits & 2048L) != 0)) { - _bits &= ~4096L; + _bits &= ~2048L; _headers._ContentType = StringValues.Empty; return true; } @@ -8871,9 +8743,9 @@ protected override bool RemoveFast(string key) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { - _bits &= ~8192L; + _bits &= ~4096L; _headers._ContentEncoding = StringValues.Empty; return true; } @@ -8885,9 +8757,9 @@ protected override bool RemoveFast(string key) if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if (((_bits & 8192L) != 0)) { - _bits &= ~16384L; + _bits &= ~8192L; _headers._ContentLanguage = StringValues.Empty; return true; } @@ -8899,9 +8771,9 @@ protected override bool RemoveFast(string key) if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if (((_bits & 16384L) != 0)) { - _bits &= ~32768L; + _bits &= ~16384L; _headers._ContentLocation = StringValues.Empty; return true; } @@ -8913,9 +8785,9 @@ protected override bool RemoveFast(string key) if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if (((_bits & 268435456L) != 0)) { - _bits &= ~536870912L; + _bits &= ~268435456L; _headers._WWWAuthenticate = StringValues.Empty; return true; } @@ -8931,9 +8803,9 @@ protected override bool RemoveFast(string key) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if (((_bits & 32768L) != 0)) { - _bits &= ~65536L; + _bits &= ~32768L; _headers._ContentMD5 = StringValues.Empty; return true; } @@ -8945,9 +8817,9 @@ protected override bool RemoveFast(string key) if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if (((_bits & 16777216L) != 0)) { - _bits &= ~33554432L; + _bits &= ~16777216L; _headers._RetryAfter = StringValues.Empty; return true; } @@ -8963,9 +8835,9 @@ protected override bool RemoveFast(string key) { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if (((_bits & 4194304L) != 0)) { - _bits &= ~8388608L; + _bits &= ~4194304L; _headers._Location = StringValues.Empty; return true; } @@ -8981,9 +8853,9 @@ protected override bool RemoveFast(string key) { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if (((_bits & 8388608L) != 0)) { - _bits &= ~16777216L; + _bits &= ~8388608L; _headers._ProxyAuthenticate = StringValues.Empty; return true; } @@ -8999,9 +8871,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if (((_bits & 536870912L) != 0)) { - _bits &= ~1073741824L; + _bits &= ~536870912L; _headers._AccessControlAllowCredentials = StringValues.Empty; return true; } @@ -9017,9 +8889,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if (((_bits & 1073741824L) != 0)) { - _bits &= ~2147483648L; + _bits &= ~1073741824L; _headers._AccessControlAllowHeaders = StringValues.Empty; return true; } @@ -9031,9 +8903,9 @@ protected override bool RemoveFast(string key) if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if (((_bits & 2147483648L) != 0)) { - _bits &= ~4294967296L; + _bits &= ~2147483648L; _headers._AccessControlAllowMethods = StringValues.Empty; return true; } @@ -9049,9 +8921,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if (((_bits & 4294967296L) != 0)) { - _bits &= ~8589934592L; + _bits &= ~4294967296L; _headers._AccessControlAllowOrigin = StringValues.Empty; return true; } @@ -9067,9 +8939,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if (((_bits & 8589934592L) != 0)) { - _bits &= ~17179869184L; + _bits &= ~8589934592L; _headers._AccessControlExposeHeaders = StringValues.Empty; return true; } @@ -9085,9 +8957,9 @@ protected override bool RemoveFast(string key) { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if (((_bits & 17179869184L) != 0)) { - _bits &= ~34359738368L; + _bits &= ~17179869184L; _headers._AccessControlMaxAge = StringValues.Empty; return true; } @@ -9098,14 +8970,31 @@ protected override bool RemoveFast(string key) } } break; + + case 14: + { + if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) + { + if (ContentLength.HasValue) + { + ContentLength = null; + return true; + } + else + { + return false; + } + } + } + break; } return MaybeUnknown?.Remove(key) ?? false; } protected override void ClearFast() { MaybeUnknown?.Clear(); - _contentLength = null; - if(FrameHeaders.BitCount(_bits) > 12) + ContentLength = null; + if(FrameHeaders.BitCount(_bits) > 11) { _headers = default(HeaderReferences); _bits = 0; @@ -9133,29 +9022,19 @@ protected override void ClearFast() } if (((_bits & 2048L) != 0)) - { - _headers._ContentLength = default(StringValues); - _bits &= ~2048L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 4096L) != 0)) { _headers._ContentType = default(StringValues); - _bits &= ~4096L; + _bits &= ~2048L; if(_bits == 0) { return; } } - if (((_bits & 67108864L) != 0)) + if (((_bits & 33554432L) != 0)) { _headers._Server = default(StringValues); - _bits &= ~67108864L; + _bits &= ~33554432L; if(_bits == 0) { return; @@ -9252,9 +9131,19 @@ protected override void ClearFast() } } - if (((_bits & 8192L) != 0)) + if (((_bits & 4096L) != 0)) { _headers._ContentEncoding = default(StringValues); + _bits &= ~4096L; + if(_bits == 0) + { + return; + } + } + + if (((_bits & 8192L) != 0)) + { + _headers._ContentLanguage = default(StringValues); _bits &= ~8192L; if(_bits == 0) { @@ -9264,7 +9153,7 @@ protected override void ClearFast() if (((_bits & 16384L) != 0)) { - _headers._ContentLanguage = default(StringValues); + _headers._ContentLocation = default(StringValues); _bits &= ~16384L; if(_bits == 0) { @@ -9274,7 +9163,7 @@ protected override void ClearFast() if (((_bits & 32768L) != 0)) { - _headers._ContentLocation = default(StringValues); + _headers._ContentMD5 = default(StringValues); _bits &= ~32768L; if(_bits == 0) { @@ -9284,7 +9173,7 @@ protected override void ClearFast() if (((_bits & 65536L) != 0)) { - _headers._ContentMD5 = default(StringValues); + _headers._ContentRange = default(StringValues); _bits &= ~65536L; if(_bits == 0) { @@ -9294,7 +9183,7 @@ protected override void ClearFast() if (((_bits & 131072L) != 0)) { - _headers._ContentRange = default(StringValues); + _headers._Expires = default(StringValues); _bits &= ~131072L; if(_bits == 0) { @@ -9304,7 +9193,7 @@ protected override void ClearFast() if (((_bits & 262144L) != 0)) { - _headers._Expires = default(StringValues); + _headers._LastModified = default(StringValues); _bits &= ~262144L; if(_bits == 0) { @@ -9314,7 +9203,7 @@ protected override void ClearFast() if (((_bits & 524288L) != 0)) { - _headers._LastModified = default(StringValues); + _headers._AcceptRanges = default(StringValues); _bits &= ~524288L; if(_bits == 0) { @@ -9324,7 +9213,7 @@ protected override void ClearFast() if (((_bits & 1048576L) != 0)) { - _headers._AcceptRanges = default(StringValues); + _headers._Age = default(StringValues); _bits &= ~1048576L; if(_bits == 0) { @@ -9334,7 +9223,7 @@ protected override void ClearFast() if (((_bits & 2097152L) != 0)) { - _headers._Age = default(StringValues); + _headers._ETag = default(StringValues); _bits &= ~2097152L; if(_bits == 0) { @@ -9344,7 +9233,7 @@ protected override void ClearFast() if (((_bits & 4194304L) != 0)) { - _headers._ETag = default(StringValues); + _headers._Location = default(StringValues); _bits &= ~4194304L; if(_bits == 0) { @@ -9354,7 +9243,7 @@ protected override void ClearFast() if (((_bits & 8388608L) != 0)) { - _headers._Location = default(StringValues); + _headers._ProxyAuthenticate = default(StringValues); _bits &= ~8388608L; if(_bits == 0) { @@ -9364,7 +9253,7 @@ protected override void ClearFast() if (((_bits & 16777216L) != 0)) { - _headers._ProxyAuthenticate = default(StringValues); + _headers._RetryAfter = default(StringValues); _bits &= ~16777216L; if(_bits == 0) { @@ -9372,10 +9261,10 @@ protected override void ClearFast() } } - if (((_bits & 33554432L) != 0)) + if (((_bits & 67108864L) != 0)) { - _headers._RetryAfter = default(StringValues); - _bits &= ~33554432L; + _headers._SetCookie = default(StringValues); + _bits &= ~67108864L; if(_bits == 0) { return; @@ -9384,7 +9273,7 @@ protected override void ClearFast() if (((_bits & 134217728L) != 0)) { - _headers._SetCookie = default(StringValues); + _headers._Vary = default(StringValues); _bits &= ~134217728L; if(_bits == 0) { @@ -9394,7 +9283,7 @@ protected override void ClearFast() if (((_bits & 268435456L) != 0)) { - _headers._Vary = default(StringValues); + _headers._WWWAuthenticate = default(StringValues); _bits &= ~268435456L; if(_bits == 0) { @@ -9404,7 +9293,7 @@ protected override void ClearFast() if (((_bits & 536870912L) != 0)) { - _headers._WWWAuthenticate = default(StringValues); + _headers._AccessControlAllowCredentials = default(StringValues); _bits &= ~536870912L; if(_bits == 0) { @@ -9414,7 +9303,7 @@ protected override void ClearFast() if (((_bits & 1073741824L) != 0)) { - _headers._AccessControlAllowCredentials = default(StringValues); + _headers._AccessControlAllowHeaders = default(StringValues); _bits &= ~1073741824L; if(_bits == 0) { @@ -9424,7 +9313,7 @@ protected override void ClearFast() if (((_bits & 2147483648L) != 0)) { - _headers._AccessControlAllowHeaders = default(StringValues); + _headers._AccessControlAllowMethods = default(StringValues); _bits &= ~2147483648L; if(_bits == 0) { @@ -9434,7 +9323,7 @@ protected override void ClearFast() if (((_bits & 4294967296L) != 0)) { - _headers._AccessControlAllowMethods = default(StringValues); + _headers._AccessControlAllowOrigin = default(StringValues); _bits &= ~4294967296L; if(_bits == 0) { @@ -9444,7 +9333,7 @@ protected override void ClearFast() if (((_bits & 8589934592L) != 0)) { - _headers._AccessControlAllowOrigin = default(StringValues); + _headers._AccessControlExposeHeaders = default(StringValues); _bits &= ~8589934592L; if(_bits == 0) { @@ -9453,19 +9342,9 @@ protected override void ClearFast() } if (((_bits & 17179869184L) != 0)) - { - _headers._AccessControlExposeHeaders = default(StringValues); - _bits &= ~17179869184L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 34359738368L) != 0)) { _headers._AccessControlMaxAge = default(StringValues); - _bits &= ~34359738368L; + _bits &= ~17179869184L; if(_bits == 0) { return; @@ -9491,7 +9370,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Cache-Control", _headers._CacheControl); ++arrayIndex; } - if (((_bits & 2L) != 0)) { if (arrayIndex == array.Length) @@ -9502,7 +9380,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Connection", _headers._Connection); ++arrayIndex; } - if (((_bits & 4L) != 0)) { if (arrayIndex == array.Length) @@ -9513,7 +9390,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Date", _headers._Date); ++arrayIndex; } - if (((_bits & 8L) != 0)) { if (arrayIndex == array.Length) @@ -9524,7 +9400,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Keep-Alive", _headers._KeepAlive); ++arrayIndex; } - if (((_bits & 16L) != 0)) { if (arrayIndex == array.Length) @@ -9535,7 +9410,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Pragma", _headers._Pragma); ++arrayIndex; } - if (((_bits & 32L) != 0)) { if (arrayIndex == array.Length) @@ -9546,7 +9420,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Trailer", _headers._Trailer); ++arrayIndex; } - if (((_bits & 64L) != 0)) { if (arrayIndex == array.Length) @@ -9557,7 +9430,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Transfer-Encoding", _headers._TransferEncoding); ++arrayIndex; } - if (((_bits & 128L) != 0)) { if (arrayIndex == array.Length) @@ -9568,7 +9440,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Upgrade", _headers._Upgrade); ++arrayIndex; } - if (((_bits & 256L) != 0)) { if (arrayIndex == array.Length) @@ -9579,7 +9450,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Via", _headers._Via); ++arrayIndex; } - if (((_bits & 512L) != 0)) { if (arrayIndex == array.Length) @@ -9590,7 +9460,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Warning", _headers._Warning); ++arrayIndex; } - if (((_bits & 1024L) != 0)) { if (arrayIndex == array.Length) @@ -9601,7 +9470,6 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Allow", _headers._Allow); ++arrayIndex; } - if (((_bits & 2048L) != 0)) { if (arrayIndex == array.Length) @@ -9609,10 +9477,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Length", _headers._ContentLength); + array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); ++arrayIndex; } - if (((_bits & 4096L) != 0)) { if (arrayIndex == array.Length) @@ -9620,10 +9487,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); + array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); ++arrayIndex; } - if (((_bits & 8192L) != 0)) { if (arrayIndex == array.Length) @@ -9631,10 +9497,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); + array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); ++arrayIndex; } - if (((_bits & 16384L) != 0)) { if (arrayIndex == array.Length) @@ -9642,10 +9507,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); + array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); ++arrayIndex; } - if (((_bits & 32768L) != 0)) { if (arrayIndex == array.Length) @@ -9653,10 +9517,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); + array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); ++arrayIndex; } - if (((_bits & 65536L) != 0)) { if (arrayIndex == array.Length) @@ -9664,10 +9527,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); + array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); ++arrayIndex; } - if (((_bits & 131072L) != 0)) { if (arrayIndex == array.Length) @@ -9675,10 +9537,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); + array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); ++arrayIndex; } - if (((_bits & 262144L) != 0)) { if (arrayIndex == array.Length) @@ -9686,10 +9547,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); + array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); ++arrayIndex; } - if (((_bits & 524288L) != 0)) { if (arrayIndex == array.Length) @@ -9697,10 +9557,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); + array[arrayIndex] = new KeyValuePair("Accept-Ranges", _headers._AcceptRanges); ++arrayIndex; } - if (((_bits & 1048576L) != 0)) { if (arrayIndex == array.Length) @@ -9708,10 +9567,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Accept-Ranges", _headers._AcceptRanges); + array[arrayIndex] = new KeyValuePair("Age", _headers._Age); ++arrayIndex; } - if (((_bits & 2097152L) != 0)) { if (arrayIndex == array.Length) @@ -9719,10 +9577,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Age", _headers._Age); + array[arrayIndex] = new KeyValuePair("ETag", _headers._ETag); ++arrayIndex; } - if (((_bits & 4194304L) != 0)) { if (arrayIndex == array.Length) @@ -9730,10 +9587,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("ETag", _headers._ETag); + array[arrayIndex] = new KeyValuePair("Location", _headers._Location); ++arrayIndex; } - if (((_bits & 8388608L) != 0)) { if (arrayIndex == array.Length) @@ -9741,10 +9597,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Location", _headers._Location); + array[arrayIndex] = new KeyValuePair("Proxy-Authenticate", _headers._ProxyAuthenticate); ++arrayIndex; } - if (((_bits & 16777216L) != 0)) { if (arrayIndex == array.Length) @@ -9752,10 +9607,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Proxy-Authenticate", _headers._ProxyAuthenticate); + array[arrayIndex] = new KeyValuePair("Retry-After", _headers._RetryAfter); ++arrayIndex; } - if (((_bits & 33554432L) != 0)) { if (arrayIndex == array.Length) @@ -9763,10 +9617,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Retry-After", _headers._RetryAfter); + array[arrayIndex] = new KeyValuePair("Server", _headers._Server); ++arrayIndex; } - if (((_bits & 67108864L) != 0)) { if (arrayIndex == array.Length) @@ -9774,10 +9627,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Server", _headers._Server); + array[arrayIndex] = new KeyValuePair("Set-Cookie", _headers._SetCookie); ++arrayIndex; } - if (((_bits & 134217728L) != 0)) { if (arrayIndex == array.Length) @@ -9785,10 +9637,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Set-Cookie", _headers._SetCookie); + array[arrayIndex] = new KeyValuePair("Vary", _headers._Vary); ++arrayIndex; } - if (((_bits & 268435456L) != 0)) { if (arrayIndex == array.Length) @@ -9796,10 +9647,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Vary", _headers._Vary); + array[arrayIndex] = new KeyValuePair("WWW-Authenticate", _headers._WWWAuthenticate); ++arrayIndex; } - if (((_bits & 536870912L) != 0)) { if (arrayIndex == array.Length) @@ -9807,10 +9657,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("WWW-Authenticate", _headers._WWWAuthenticate); + array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Credentials", _headers._AccessControlAllowCredentials); ++arrayIndex; } - if (((_bits & 1073741824L) != 0)) { if (arrayIndex == array.Length) @@ -9818,10 +9667,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Credentials", _headers._AccessControlAllowCredentials); + array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Headers", _headers._AccessControlAllowHeaders); ++arrayIndex; } - if (((_bits & 2147483648L) != 0)) { if (arrayIndex == array.Length) @@ -9829,10 +9677,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Headers", _headers._AccessControlAllowHeaders); + array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Methods", _headers._AccessControlAllowMethods); ++arrayIndex; } - if (((_bits & 4294967296L) != 0)) { if (arrayIndex == array.Length) @@ -9840,10 +9687,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Methods", _headers._AccessControlAllowMethods); + array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Origin", _headers._AccessControlAllowOrigin); ++arrayIndex; } - if (((_bits & 8589934592L) != 0)) { if (arrayIndex == array.Length) @@ -9851,10 +9697,9 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Origin", _headers._AccessControlAllowOrigin); + array[arrayIndex] = new KeyValuePair("Access-Control-Expose-Headers", _headers._AccessControlExposeHeaders); ++arrayIndex; } - if (((_bits & 17179869184L) != 0)) { if (arrayIndex == array.Length) @@ -9862,28 +9707,27 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Expose-Headers", _headers._AccessControlExposeHeaders); + array[arrayIndex] = new KeyValuePair("Access-Control-Max-Age", _headers._AccessControlMaxAge); ++arrayIndex; } - - if (((_bits & 34359738368L) != 0)) + if (ContentLength.HasValue) { if (arrayIndex == array.Length) { ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Access-Control-Max-Age", _headers._AccessControlMaxAge); + array[arrayIndex] = new KeyValuePair("Content-Length", ContentLength.ToString()); ++arrayIndex; } - ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); } protected void CopyToFast(ref MemoryPoolIterator output) { - var tempBits = _bits; + var tempBits = _bits | (ContentLength.HasValue ? -9223372036854775808L : 0); + if (((_bits & 2L) != 0)) { if (_headers._rawConnection != null) @@ -9911,6 +9755,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 4L) != 0)) { if (_headers._rawDate != null) @@ -9938,34 +9783,8 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 2048L) != 0)) - { - if (_headers._rawContentLength != null) - { - output.CopyFrom(_headers._rawContentLength, 0, _headers._rawContentLength.Length); - } - else - { - var valueCount = _headers._ContentLength.Count; - for (var i = 0; i < valueCount; i++) - { - var value = _headers._ContentLength[i]; - if (value != null) - { - output.CopyFrom(_headerBytes, 133, 18); - output.CopyFromAscii(value); - } - } - } - - tempBits &= ~2048L; - if(tempBits == 0) - { - return; - } - } - - if (((_bits & 4096L) != 0)) { { var valueCount = _headers._ContentType.Count; @@ -9974,20 +9793,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentType[i]; if (value != null) { - output.CopyFrom(_headerBytes, 151, 16); + output.CopyFrom(_headerBytes, 133, 16); output.CopyFromAscii(value); } } } - tempBits &= ~4096L; + tempBits &= ~2048L; if(tempBits == 0) { return; } } - if (((_bits & 67108864L) != 0)) + + if (((_bits & 33554432L) != 0)) { if (_headers._rawServer != null) { @@ -10001,19 +9821,33 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._Server[i]; if (value != null) { - output.CopyFrom(_headerBytes, 368, 10); + output.CopyFrom(_headerBytes, 350, 10); output.CopyFromAscii(value); } } } - tempBits &= ~67108864L; + tempBits &= ~33554432L; + if(tempBits == 0) + { + return; + } + } + + + if (ContentLength.HasValue) + { + output.CopyFrom(_headerBytes, 592, 18); + output.CopyFromNumeric(ContentLength.Value); + + tempBits &= ~-9223372036854775808L; if(tempBits == 0) { return; } } + if (((_bits & 1L) != 0)) { { @@ -10036,6 +9870,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 8L) != 0)) { { @@ -10058,6 +9893,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 16L) != 0)) { { @@ -10080,6 +9916,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 32L) != 0)) { { @@ -10102,6 +9939,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 64L) != 0)) { if (_headers._rawTransferEncoding != null) @@ -10129,6 +9967,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 128L) != 0)) { { @@ -10151,6 +9990,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 256L) != 0)) { { @@ -10173,6 +10013,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 512L) != 0)) { { @@ -10195,6 +10036,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } + if (((_bits & 1024L) != 0)) { { @@ -10217,7 +10059,8 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - if (((_bits & 8192L) != 0)) + + if (((_bits & 4096L) != 0)) { { var valueCount = _headers._ContentEncoding.Count; @@ -10226,20 +10069,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentEncoding[i]; if (value != null) { - output.CopyFrom(_headerBytes, 167, 20); + output.CopyFrom(_headerBytes, 149, 20); output.CopyFromAscii(value); } } } - tempBits &= ~8192L; + tempBits &= ~4096L; if(tempBits == 0) { return; } } - if (((_bits & 16384L) != 0)) + + if (((_bits & 8192L) != 0)) { { var valueCount = _headers._ContentLanguage.Count; @@ -10248,20 +10092,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentLanguage[i]; if (value != null) { - output.CopyFrom(_headerBytes, 187, 20); + output.CopyFrom(_headerBytes, 169, 20); output.CopyFromAscii(value); } } } - tempBits &= ~16384L; + tempBits &= ~8192L; if(tempBits == 0) { return; } } - if (((_bits & 32768L) != 0)) + + if (((_bits & 16384L) != 0)) { { var valueCount = _headers._ContentLocation.Count; @@ -10270,20 +10115,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentLocation[i]; if (value != null) { - output.CopyFrom(_headerBytes, 207, 20); + output.CopyFrom(_headerBytes, 189, 20); output.CopyFromAscii(value); } } } - tempBits &= ~32768L; + tempBits &= ~16384L; if(tempBits == 0) { return; } } - if (((_bits & 65536L) != 0)) + + if (((_bits & 32768L) != 0)) { { var valueCount = _headers._ContentMD5.Count; @@ -10292,20 +10138,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentMD5[i]; if (value != null) { - output.CopyFrom(_headerBytes, 227, 15); + output.CopyFrom(_headerBytes, 209, 15); output.CopyFromAscii(value); } } } - tempBits &= ~65536L; + tempBits &= ~32768L; if(tempBits == 0) { return; } } - if (((_bits & 131072L) != 0)) + + if (((_bits & 65536L) != 0)) { { var valueCount = _headers._ContentRange.Count; @@ -10314,20 +10161,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ContentRange[i]; if (value != null) { - output.CopyFrom(_headerBytes, 242, 17); + output.CopyFrom(_headerBytes, 224, 17); output.CopyFromAscii(value); } } } - tempBits &= ~131072L; + tempBits &= ~65536L; if(tempBits == 0) { return; } } - if (((_bits & 262144L) != 0)) + + if (((_bits & 131072L) != 0)) { { var valueCount = _headers._Expires.Count; @@ -10336,20 +10184,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._Expires[i]; if (value != null) { - output.CopyFrom(_headerBytes, 259, 11); + output.CopyFrom(_headerBytes, 241, 11); output.CopyFromAscii(value); } } } - tempBits &= ~262144L; + tempBits &= ~131072L; if(tempBits == 0) { return; } } - if (((_bits & 524288L) != 0)) + + if (((_bits & 262144L) != 0)) { { var valueCount = _headers._LastModified.Count; @@ -10358,20 +10207,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._LastModified[i]; if (value != null) { - output.CopyFrom(_headerBytes, 270, 17); + output.CopyFrom(_headerBytes, 252, 17); output.CopyFromAscii(value); } } } - tempBits &= ~524288L; + tempBits &= ~262144L; if(tempBits == 0) { return; } } - if (((_bits & 1048576L) != 0)) + + if (((_bits & 524288L) != 0)) { { var valueCount = _headers._AcceptRanges.Count; @@ -10380,20 +10230,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AcceptRanges[i]; if (value != null) { - output.CopyFrom(_headerBytes, 287, 17); + output.CopyFrom(_headerBytes, 269, 17); output.CopyFromAscii(value); } } } - tempBits &= ~1048576L; + tempBits &= ~524288L; if(tempBits == 0) { return; } } - if (((_bits & 2097152L) != 0)) + + if (((_bits & 1048576L) != 0)) { { var valueCount = _headers._Age.Count; @@ -10402,20 +10253,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._Age[i]; if (value != null) { - output.CopyFrom(_headerBytes, 304, 7); + output.CopyFrom(_headerBytes, 286, 7); output.CopyFromAscii(value); } } } - tempBits &= ~2097152L; + tempBits &= ~1048576L; if(tempBits == 0) { return; } } - if (((_bits & 4194304L) != 0)) + + if (((_bits & 2097152L) != 0)) { { var valueCount = _headers._ETag.Count; @@ -10424,20 +10276,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ETag[i]; if (value != null) { - output.CopyFrom(_headerBytes, 311, 8); + output.CopyFrom(_headerBytes, 293, 8); output.CopyFromAscii(value); } } } - tempBits &= ~4194304L; + tempBits &= ~2097152L; if(tempBits == 0) { return; } } - if (((_bits & 8388608L) != 0)) + + if (((_bits & 4194304L) != 0)) { { var valueCount = _headers._Location.Count; @@ -10446,20 +10299,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._Location[i]; if (value != null) { - output.CopyFrom(_headerBytes, 319, 12); + output.CopyFrom(_headerBytes, 301, 12); output.CopyFromAscii(value); } } } - tempBits &= ~8388608L; + tempBits &= ~4194304L; if(tempBits == 0) { return; } } - if (((_bits & 16777216L) != 0)) + + if (((_bits & 8388608L) != 0)) { { var valueCount = _headers._ProxyAuthenticate.Count; @@ -10468,20 +10322,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._ProxyAuthenticate[i]; if (value != null) { - output.CopyFrom(_headerBytes, 331, 22); + output.CopyFrom(_headerBytes, 313, 22); output.CopyFromAscii(value); } } } - tempBits &= ~16777216L; + tempBits &= ~8388608L; if(tempBits == 0) { return; } } - if (((_bits & 33554432L) != 0)) + + if (((_bits & 16777216L) != 0)) { { var valueCount = _headers._RetryAfter.Count; @@ -10490,20 +10345,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._RetryAfter[i]; if (value != null) { - output.CopyFrom(_headerBytes, 353, 15); + output.CopyFrom(_headerBytes, 335, 15); output.CopyFromAscii(value); } } } - tempBits &= ~33554432L; + tempBits &= ~16777216L; if(tempBits == 0) { return; } } - if (((_bits & 134217728L) != 0)) + + if (((_bits & 67108864L) != 0)) { { var valueCount = _headers._SetCookie.Count; @@ -10512,20 +10368,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._SetCookie[i]; if (value != null) { - output.CopyFrom(_headerBytes, 378, 14); + output.CopyFrom(_headerBytes, 360, 14); output.CopyFromAscii(value); } } } - tempBits &= ~134217728L; + tempBits &= ~67108864L; if(tempBits == 0) { return; } } - if (((_bits & 268435456L) != 0)) + + if (((_bits & 134217728L) != 0)) { { var valueCount = _headers._Vary.Count; @@ -10534,20 +10391,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._Vary[i]; if (value != null) { - output.CopyFrom(_headerBytes, 392, 8); + output.CopyFrom(_headerBytes, 374, 8); output.CopyFromAscii(value); } } } - tempBits &= ~268435456L; + tempBits &= ~134217728L; if(tempBits == 0) { return; } } - if (((_bits & 536870912L) != 0)) + + if (((_bits & 268435456L) != 0)) { { var valueCount = _headers._WWWAuthenticate.Count; @@ -10556,20 +10414,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._WWWAuthenticate[i]; if (value != null) { - output.CopyFrom(_headerBytes, 400, 20); + output.CopyFrom(_headerBytes, 382, 20); output.CopyFromAscii(value); } } } - tempBits &= ~536870912L; + tempBits &= ~268435456L; if(tempBits == 0) { return; } } - if (((_bits & 1073741824L) != 0)) + + if (((_bits & 536870912L) != 0)) { { var valueCount = _headers._AccessControlAllowCredentials.Count; @@ -10578,20 +10437,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlAllowCredentials[i]; if (value != null) { - output.CopyFrom(_headerBytes, 420, 36); + output.CopyFrom(_headerBytes, 402, 36); output.CopyFromAscii(value); } } } - tempBits &= ~1073741824L; + tempBits &= ~536870912L; if(tempBits == 0) { return; } } - if (((_bits & 2147483648L) != 0)) + + if (((_bits & 1073741824L) != 0)) { { var valueCount = _headers._AccessControlAllowHeaders.Count; @@ -10600,20 +10460,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlAllowHeaders[i]; if (value != null) { - output.CopyFrom(_headerBytes, 456, 32); + output.CopyFrom(_headerBytes, 438, 32); output.CopyFromAscii(value); } } } - tempBits &= ~2147483648L; + tempBits &= ~1073741824L; if(tempBits == 0) { return; } } - if (((_bits & 4294967296L) != 0)) + + if (((_bits & 2147483648L) != 0)) { { var valueCount = _headers._AccessControlAllowMethods.Count; @@ -10622,20 +10483,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlAllowMethods[i]; if (value != null) { - output.CopyFrom(_headerBytes, 488, 32); + output.CopyFrom(_headerBytes, 470, 32); output.CopyFromAscii(value); } } } - tempBits &= ~4294967296L; + tempBits &= ~2147483648L; if(tempBits == 0) { return; } } - if (((_bits & 8589934592L) != 0)) + + if (((_bits & 4294967296L) != 0)) { { var valueCount = _headers._AccessControlAllowOrigin.Count; @@ -10644,20 +10506,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlAllowOrigin[i]; if (value != null) { - output.CopyFrom(_headerBytes, 520, 31); + output.CopyFrom(_headerBytes, 502, 31); output.CopyFromAscii(value); } } } - tempBits &= ~8589934592L; + tempBits &= ~4294967296L; if(tempBits == 0) { return; } } - if (((_bits & 17179869184L) != 0)) + + if (((_bits & 8589934592L) != 0)) { { var valueCount = _headers._AccessControlExposeHeaders.Count; @@ -10666,20 +10529,21 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlExposeHeaders[i]; if (value != null) { - output.CopyFrom(_headerBytes, 551, 33); + output.CopyFrom(_headerBytes, 533, 33); output.CopyFromAscii(value); } } } - tempBits &= ~17179869184L; + tempBits &= ~8589934592L; if(tempBits == 0) { return; } } - if (((_bits & 34359738368L) != 0)) + + if (((_bits & 17179869184L) != 0)) { { var valueCount = _headers._AccessControlMaxAge.Count; @@ -10688,13 +10552,13 @@ protected void CopyToFast(ref MemoryPoolIterator output) var value = _headers._AccessControlMaxAge[i]; if (value != null) { - output.CopyFrom(_headerBytes, 584, 26); + output.CopyFrom(_headerBytes, 566, 26); output.CopyFromAscii(value); } } } - tempBits &= ~34359738368L; + tempBits &= ~17179869184L; if(tempBits == 0) { return; @@ -10718,7 +10582,6 @@ private struct HeaderReferences public StringValues _Via; public StringValues _Warning; public StringValues _Allow; - public StringValues _ContentLength; public StringValues _ContentType; public StringValues _ContentEncoding; public StringValues _ContentLanguage; @@ -10747,7 +10610,6 @@ private struct HeaderReferences public byte[] _rawConnection; public byte[] _rawDate; public byte[] _rawTransferEncoding; - public byte[] _rawContentLength; public byte[] _rawServer; } @@ -10758,114 +10620,113 @@ public bool MoveNext() switch (_state) { - case 0: - goto state0; + case 0: + goto state0; - case 1: - goto state1; + case 1: + goto state1; - case 2: - goto state2; - - case 3: - goto state3; + case 2: + goto state2; - case 4: - goto state4; + case 3: + goto state3; - case 5: - goto state5; + case 4: + goto state4; - case 6: - goto state6; + case 5: + goto state5; - case 7: - goto state7; + case 6: + goto state6; - case 8: - goto state8; + case 7: + goto state7; - case 9: - goto state9; + case 8: + goto state8; - case 10: - goto state10; + case 9: + goto state9; - case 11: - goto state11; + case 10: + goto state10; - case 12: - goto state12; + case 11: + goto state11; - case 13: - goto state13; + case 12: + goto state12; - case 14: - goto state14; + case 13: + goto state13; - case 15: - goto state15; + case 14: + goto state14; - case 16: - goto state16; + case 15: + goto state15; - case 17: - goto state17; + case 16: + goto state16; - case 18: - goto state18; + case 17: + goto state17; - case 19: - goto state19; + case 18: + goto state18; - case 20: - goto state20; + case 19: + goto state19; - case 21: - goto state21; + case 20: + goto state20; - case 22: - goto state22; + case 21: + goto state21; - case 23: - goto state23; + case 22: + goto state22; - case 24: - goto state24; + case 23: + goto state23; - case 25: - goto state25; + case 24: + goto state24; - case 26: - goto state26; + case 25: + goto state25; - case 27: - goto state27; + case 26: + goto state26; - case 28: - goto state28; + case 27: + goto state27; - case 29: - goto state29; + case 28: + goto state28; - case 30: - goto state30; + case 29: + goto state29; - case 31: - goto state31; + case 30: + goto state30; - case 32: - goto state32; + case 31: + goto state31; - case 33: - goto state33; + case 32: + goto state32; - case 34: - goto state34; + case 33: + goto state33; - case 35: - goto state35; + case 34: + goto state34; + case 36: + goto state36; default: goto state_default; } @@ -10961,7 +10822,7 @@ public bool MoveNext() state11: if (((_bits & 2048L) != 0)) { - _current = new KeyValuePair("Content-Length", _collection._headers._ContentLength); + _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); _state = 12; return true; } @@ -10969,7 +10830,7 @@ public bool MoveNext() state12: if (((_bits & 4096L) != 0)) { - _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); + _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); _state = 13; return true; } @@ -10977,7 +10838,7 @@ public bool MoveNext() state13: if (((_bits & 8192L) != 0)) { - _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); + _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); _state = 14; return true; } @@ -10985,7 +10846,7 @@ public bool MoveNext() state14: if (((_bits & 16384L) != 0)) { - _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); + _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); _state = 15; return true; } @@ -10993,7 +10854,7 @@ public bool MoveNext() state15: if (((_bits & 32768L) != 0)) { - _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); + _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); _state = 16; return true; } @@ -11001,7 +10862,7 @@ public bool MoveNext() state16: if (((_bits & 65536L) != 0)) { - _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); + _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); _state = 17; return true; } @@ -11009,7 +10870,7 @@ public bool MoveNext() state17: if (((_bits & 131072L) != 0)) { - _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); + _current = new KeyValuePair("Expires", _collection._headers._Expires); _state = 18; return true; } @@ -11017,7 +10878,7 @@ public bool MoveNext() state18: if (((_bits & 262144L) != 0)) { - _current = new KeyValuePair("Expires", _collection._headers._Expires); + _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); _state = 19; return true; } @@ -11025,7 +10886,7 @@ public bool MoveNext() state19: if (((_bits & 524288L) != 0)) { - _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); + _current = new KeyValuePair("Accept-Ranges", _collection._headers._AcceptRanges); _state = 20; return true; } @@ -11033,7 +10894,7 @@ public bool MoveNext() state20: if (((_bits & 1048576L) != 0)) { - _current = new KeyValuePair("Accept-Ranges", _collection._headers._AcceptRanges); + _current = new KeyValuePair("Age", _collection._headers._Age); _state = 21; return true; } @@ -11041,7 +10902,7 @@ public bool MoveNext() state21: if (((_bits & 2097152L) != 0)) { - _current = new KeyValuePair("Age", _collection._headers._Age); + _current = new KeyValuePair("ETag", _collection._headers._ETag); _state = 22; return true; } @@ -11049,7 +10910,7 @@ public bool MoveNext() state22: if (((_bits & 4194304L) != 0)) { - _current = new KeyValuePair("ETag", _collection._headers._ETag); + _current = new KeyValuePair("Location", _collection._headers._Location); _state = 23; return true; } @@ -11057,7 +10918,7 @@ public bool MoveNext() state23: if (((_bits & 8388608L) != 0)) { - _current = new KeyValuePair("Location", _collection._headers._Location); + _current = new KeyValuePair("Proxy-Authenticate", _collection._headers._ProxyAuthenticate); _state = 24; return true; } @@ -11065,7 +10926,7 @@ public bool MoveNext() state24: if (((_bits & 16777216L) != 0)) { - _current = new KeyValuePair("Proxy-Authenticate", _collection._headers._ProxyAuthenticate); + _current = new KeyValuePair("Retry-After", _collection._headers._RetryAfter); _state = 25; return true; } @@ -11073,7 +10934,7 @@ public bool MoveNext() state25: if (((_bits & 33554432L) != 0)) { - _current = new KeyValuePair("Retry-After", _collection._headers._RetryAfter); + _current = new KeyValuePair("Server", _collection._headers._Server); _state = 26; return true; } @@ -11081,7 +10942,7 @@ public bool MoveNext() state26: if (((_bits & 67108864L) != 0)) { - _current = new KeyValuePair("Server", _collection._headers._Server); + _current = new KeyValuePair("Set-Cookie", _collection._headers._SetCookie); _state = 27; return true; } @@ -11089,7 +10950,7 @@ public bool MoveNext() state27: if (((_bits & 134217728L) != 0)) { - _current = new KeyValuePair("Set-Cookie", _collection._headers._SetCookie); + _current = new KeyValuePair("Vary", _collection._headers._Vary); _state = 28; return true; } @@ -11097,7 +10958,7 @@ public bool MoveNext() state28: if (((_bits & 268435456L) != 0)) { - _current = new KeyValuePair("Vary", _collection._headers._Vary); + _current = new KeyValuePair("WWW-Authenticate", _collection._headers._WWWAuthenticate); _state = 29; return true; } @@ -11105,7 +10966,7 @@ public bool MoveNext() state29: if (((_bits & 536870912L) != 0)) { - _current = new KeyValuePair("WWW-Authenticate", _collection._headers._WWWAuthenticate); + _current = new KeyValuePair("Access-Control-Allow-Credentials", _collection._headers._AccessControlAllowCredentials); _state = 30; return true; } @@ -11113,7 +10974,7 @@ public bool MoveNext() state30: if (((_bits & 1073741824L) != 0)) { - _current = new KeyValuePair("Access-Control-Allow-Credentials", _collection._headers._AccessControlAllowCredentials); + _current = new KeyValuePair("Access-Control-Allow-Headers", _collection._headers._AccessControlAllowHeaders); _state = 31; return true; } @@ -11121,7 +10982,7 @@ public bool MoveNext() state31: if (((_bits & 2147483648L) != 0)) { - _current = new KeyValuePair("Access-Control-Allow-Headers", _collection._headers._AccessControlAllowHeaders); + _current = new KeyValuePair("Access-Control-Allow-Methods", _collection._headers._AccessControlAllowMethods); _state = 32; return true; } @@ -11129,7 +10990,7 @@ public bool MoveNext() state32: if (((_bits & 4294967296L) != 0)) { - _current = new KeyValuePair("Access-Control-Allow-Methods", _collection._headers._AccessControlAllowMethods); + _current = new KeyValuePair("Access-Control-Allow-Origin", _collection._headers._AccessControlAllowOrigin); _state = 33; return true; } @@ -11137,7 +10998,7 @@ public bool MoveNext() state33: if (((_bits & 8589934592L) != 0)) { - _current = new KeyValuePair("Access-Control-Allow-Origin", _collection._headers._AccessControlAllowOrigin); + _current = new KeyValuePair("Access-Control-Expose-Headers", _collection._headers._AccessControlExposeHeaders); _state = 34; return true; } @@ -11145,19 +11006,18 @@ public bool MoveNext() state34: if (((_bits & 17179869184L) != 0)) { - _current = new KeyValuePair("Access-Control-Expose-Headers", _collection._headers._AccessControlExposeHeaders); + _current = new KeyValuePair("Access-Control-Max-Age", _collection._headers._AccessControlMaxAge); _state = 35; return true; } - state35: - if (((_bits & 34359738368L) != 0)) + state36: + if (_collection.ContentLength.HasValue) { - _current = new KeyValuePair("Access-Control-Max-Age", _collection._headers._AccessControlMaxAge); - _state = 36; + _current = new KeyValuePair("Content-Length", _collection.ContentLength.ToString()); + _state = 37; return true; } - state_default: if (!_hasUnknown || !_unknownEnumerator.MoveNext()) { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index 4cb77a278..a9fa4bb6e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -15,9 +15,10 @@ public abstract class FrameHeaders : IHeaderDictionary { protected bool _isReadOnly; protected Dictionary MaybeUnknown; - protected Dictionary Unknown => MaybeUnknown ?? (MaybeUnknown = new Dictionary(StringComparer.OrdinalIgnoreCase)); + public long? ContentLength { get; set; } + StringValues IHeaderDictionary.this[string key] { get @@ -235,10 +236,10 @@ public static void ValidateHeaderCharacters(string headerCharacters) } } - public static long ParseContentLength(StringValues value) + public static long ParseContentLength(string value) { long parsed; - if (!HeaderUtilities.TryParseInt64(value.ToString(), out parsed)) + if (!HeaderUtilities.TryParseInt64(value, out parsed)) { ThrowInvalidContentLengthException(value); } @@ -412,7 +413,7 @@ public static unsafe TransferCoding GetFinalTransferCoding(StringValues transfer return transferEncodingOptions; } - private static void ThrowInvalidContentLengthException(string value) + protected static void ThrowInvalidContentLengthException(string value) { throw new InvalidOperationException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); } diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs index ccb5e0d46..96012c0ad 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs @@ -13,20 +13,16 @@ public partial class FrameResponseHeaders : FrameHeaders private static readonly byte[] _CrLf = new[] { (byte)'\r', (byte)'\n' }; private static readonly byte[] _colonSpace = new[] { (byte)':', (byte)' ' }; - private long? _contentLength; - public bool HasConnection => HeaderConnection.Count != 0; public bool HasTransferEncoding => HeaderTransferEncoding.Count != 0; - public bool HasContentLength => HeaderContentLength.Count != 0; + public bool HasContentLength => ContentLength.HasValue; public bool HasServer => HeaderServer.Count != 0; public bool HasDate => HeaderDate.Count != 0; - public long? HeaderContentLengthValue => _contentLength; - public Enumerator GetEnumerator() { return new Enumerator(this); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs index 50cb46874..c67135711 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs @@ -266,18 +266,9 @@ public static MessageBody For( return new ForChunkedEncoding(keepAlive, headers, context); } - var unparsedContentLength = headers.HeaderContentLength; - if (unparsedContentLength.Count > 0) + if (headers.ContentLength.HasValue) { - try - { - var contentLength = FrameHeaders.ParseContentLength(unparsedContentLength); - return new ForContentLength(keepAlive, contentLength, context); - } - catch (InvalidOperationException) - { - context.RejectRequest(RequestRejectionReason.InvalidContentLength, unparsedContentLength); - } + return new ForContentLength(keepAlive, headers.ContentLength.Value, context); } // Avoid slowing down most common case diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs index b1b45eb6e..264e29657 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs @@ -13,6 +13,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure { public struct MemoryPoolIterator { + private const int _maxPositiveLongByteLength = 19; private const ulong _xorPowerOfTwoToHighByte = (0x07ul | 0x06ul << 8 | 0x05ul << 16 | @@ -23,6 +24,9 @@ public struct MemoryPoolIterator private static readonly int _vectorSpan = Vector.Count; + [ThreadStatic] + private static byte[] _numericBytesScratch; + private MemoryPoolBlock _block; private int _index; @@ -1082,6 +1086,30 @@ public unsafe void CopyFromAscii(string data) _index = blockIndex; } + private static byte[] NumericBytesScratch => _numericBytesScratch ?? CreateNumericBytesScratch(); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static byte[] CreateNumericBytesScratch() + { + return (_numericBytesScratch = new byte[_maxPositiveLongByteLength]); + } + + public void CopyFromNumeric(long value) + { + var position = _maxPositiveLongByteLength; + var byteBuffer = NumericBytesScratch; + do + { + // Consider using Math.DivRem() if available + var quotient = value / 10; + byteBuffer[--position] = (byte)(0x30 + (value - quotient * 10)); // 0x30 = '0' + value = quotient; + } + while (value != 0); + + CopyFrom(byteBuffer, position, _maxPositiveLongByteLength - position); + } + public unsafe string GetAsciiString(ref MemoryPoolIterator end) { var block = _block; @@ -1253,6 +1281,5 @@ public static Vector GetVector(byte vectorByte) // https://github.com/dotnet/coreclr/issues/7459#issuecomment-253965670 return Vector.AsVectorByte(new Vector(vectorByte * 0x01010101u)); } - } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/DefaultHeaderTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/DefaultHeaderTests.cs index b8a843f73..2493387b9 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/DefaultHeaderTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/DefaultHeaderTests.cs @@ -32,14 +32,14 @@ await connection.Send( await connection.ReceiveEnd( "HTTP/1.1 200 OK", $"Date: {testContext.DateHeaderValue}", - "Content-Length: 0", "Server: Kestrel", + "Content-Length: 0", "", "HTTP/1.1 200 OK", "Connection: close", $"Date: {testContext.DateHeaderValue}", - "Content-Length: 0", "Server: Kestrel", + "Content-Length: 0", "", ""); } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs index 55ec8ee48..7d4c16ac2 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs @@ -173,16 +173,6 @@ public void ThrowsWhenSettingContentLengthToNonNumericValue(string contentLength Assert.Equal($"Invalid Content-Length: \"{contentLength}\". Value must be a positive integral number.", exception.Message); } - [Theory] - [MemberData(nameof(BadContentLengths))] - public void ThrowsWhenSettingRawContentLengthToNonNumericValue(string contentLength) - { - var headers = new FrameResponseHeaders(); - - var exception = Assert.Throws(() => headers.SetRawContentLength(contentLength, Encoding.ASCII.GetBytes(contentLength))); - Assert.Equal($"Invalid Content-Length: \"{contentLength}\". Value must be a positive integral number.", exception.Message); - } - [Theory] [MemberData(nameof(BadContentLengths))] public void ThrowsWhenAssigningHeaderContentLengthToNonNumericValue(string contentLength) @@ -201,7 +191,7 @@ public void ContentLengthValueCanBeReadAsLongAfterAddingHeader(string contentLen var dictionary = (IDictionary)headers; dictionary.Add("Content-Length", contentLength); - Assert.Equal(ParseLong(contentLength), headers.HeaderContentLengthValue); + Assert.Equal(ParseLong(contentLength), headers.ContentLength); } [Theory] @@ -212,17 +202,7 @@ public void ContentLengthValueCanBeReadAsLongAfterSettingHeader(string contentLe var dictionary = (IDictionary)headers; dictionary["Content-Length"] = contentLength; - Assert.Equal(ParseLong(contentLength), headers.HeaderContentLengthValue); - } - - [Theory] - [MemberData(nameof(GoodContentLengths))] - public void ContentLengthValueCanBeReadAsLongAfterSettingRawHeader(string contentLength) - { - var headers = new FrameResponseHeaders(); - headers.SetRawContentLength(contentLength, Encoding.ASCII.GetBytes(contentLength)); - - Assert.Equal(ParseLong(contentLength), headers.HeaderContentLengthValue); + Assert.Equal(ParseLong(contentLength), headers.ContentLength); } [Theory] @@ -232,7 +212,7 @@ public void ContentLengthValueCanBeReadAsLongAfterAssigningHeader(string content var headers = new FrameResponseHeaders(); headers.HeaderContentLength = contentLength; - Assert.Equal(ParseLong(contentLength), headers.HeaderContentLengthValue); + Assert.Equal(ParseLong(contentLength), headers.ContentLength); } [Fact] @@ -244,7 +224,7 @@ public void ContentLengthValueClearedWhenHeaderIsRemoved() dictionary.Remove("Content-Length"); - Assert.Equal(null, headers.HeaderContentLengthValue); + Assert.Equal(null, headers.ContentLength); } [Fact] @@ -256,7 +236,7 @@ public void ContentLengthValueClearedWhenHeadersCleared() dictionary.Clear(); - Assert.Equal(null, headers.HeaderContentLengthValue); + Assert.Equal(null, headers.ContentLength); } private static long ParseLong(string value) diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index bd0c24aa0..45f816055 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -31,19 +31,27 @@ static string AppendSwitch(IEnumerable> values, stri case {byLength.Key}: {{{Each(byLength, header => $@" if ({header.EqualIgnoreCaseBytes()}) - {{ + {{{(header.Identifier == "ContentLength" ? @" + if (ContentLength.HasValue) + { + ThrowInvalidContentLengthException(AppendValue(ContentLength.ToString(), value).ToString()); + } + else + { + ContentLength = ParseContentLength(value); + } + return;" : $@" if ({header.TestBit()}) {{ _headers._{header.Identifier} = AppendValue(_headers._{header.Identifier}, value); }} else - {{{If(className == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = ParseContentLength(value);")} + {{ {header.SetBit()}; _headers._{header.Identifier} = new StringValues(value);{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")} }} - return; + return;")} }} ")}}} break; @@ -192,19 +200,28 @@ public static string GeneratedFile() "TE", "Translate", "User-Agent", - }).Concat(corsRequestHeaders).Select((header, index) => new KnownHeader + }) + .Concat(corsRequestHeaders) + .Where((header) => header != "Content-Length") + .Select((header, index) => new KnownHeader { Name = header, Index = index, PrimaryHeader = requestPrimaryHeaders.Contains(header) - }).ToArray(); + }) + .Concat(new[] { new KnownHeader + { + Name = "Content-Length", + Index = -1, + PrimaryHeader = requestPrimaryHeaders.Contains("Content-Length") + }}) + .ToArray(); var enhancedHeaders = new[] { "Connection", "Server", "Date", - "Transfer-Encoding", - "Content-Length", + "Transfer-Encoding" }; // http://www.w3.org/TR/cors/#syntax var corsResponseHeaders = new[] @@ -228,13 +245,24 @@ public static string GeneratedFile() "Set-Cookie", "Vary", "WWW-Authenticate", - }).Concat(corsResponseHeaders).Select((header, index) => new KnownHeader + }) + .Concat(corsResponseHeaders) + .Where((header) => header != "Content-Length") + .Select((header, index) => new KnownHeader { Name = header, Index = index, EnhancedSetter = enhancedHeaders.Contains(header), PrimaryHeader = responsePrimaryHeaders.Contains(header) - }).ToArray(); + }) + .Concat(new[] { new KnownHeader + { + Name = "Content-Length", + Index = -1, + EnhancedSetter = enhancedHeaders.Contains("Content-Length"), + PrimaryHeader = responsePrimaryHeaders.Contains("Content-Length") + }}) + .ToArray(); var loops = new[] { new @@ -286,7 +314,19 @@ public partial class {loop.ClassName} private HeaderReferences _headers; {Each(loop.Headers, header => $@" public StringValues Header{header.Identifier} - {{ + {{{(header.Identifier == "ContentLength" ? @" + get + { + if (ContentLength.HasValue) + { + return ContentLength.ToString(); + } + return StringValues.Empty; + } + set + { + ContentLength = ParseContentLength(value); + }" : $@" get {{ if ({header.TestBit()}) @@ -296,24 +336,22 @@ public StringValues Header{header.Identifier} return StringValues.Empty; }} set - {{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = ParseContentLength(value);")} + {{ {header.SetBit()}; _headers._{header.Identifier} = value; {(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")} - }} + }}")} }}")} {Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@" public void SetRaw{header.Identifier}(StringValues value, byte[] raw) - {{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = ParseContentLength(value);")} + {{ {header.SetBit()}; _headers._{header.Identifier} = value; _headers._raw{header.Identifier} = raw; }}")} protected override int GetCountFast() {{ - return BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); }} protected override StringValues GetValueFast(string key) {{ @@ -322,7 +360,15 @@ protected override StringValues GetValueFast(string key) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{ + {{{(header.Identifier == "ContentLength" ? @" + if (ContentLength.HasValue) + { + return ContentLength.ToString(); + } + else + { + ThrowKeyNotFoundException(); + }" : $@" if ({header.TestBit()}) {{ return _headers._{header.Identifier}; @@ -330,11 +376,11 @@ protected override StringValues GetValueFast(string key) else {{ ThrowKeyNotFoundException(); - }} + }}")} }} ")}}} - break; -")}}} + break;")} + }} if (MaybeUnknown == null) {{ ThrowKeyNotFoundException(); @@ -348,7 +394,17 @@ protected override bool TryGetValueFast(string key, out StringValues value) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{ + {{{(header.Identifier == "ContentLength" ? @" + if (ContentLength.HasValue) + { + value = ContentLength.ToString(); + return true; + } + else + { + value = StringValues.Empty; + return false; + }" : $@" if ({header.TestBit()}) {{ value = _headers._{header.Identifier}; @@ -358,7 +414,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) {{ value = StringValues.Empty; return false; - }} + }}")} }} ")}}} break; @@ -374,11 +430,11 @@ protected override void SetValueFast(string key, StringValues value) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = ParseContentLength(value);")} + {{{(header.Identifier == "ContentLength" ? @" + ContentLength = ParseContentLength(value);" : $@" {header.SetBit()}; _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" - _headers._raw{header.Identifier} = null;")} + _headers._raw{header.Identifier} = null;")}")} return; }} ")}}} @@ -395,16 +451,22 @@ protected override void AddValueFast(string key, StringValues value) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{ + {{{(header.Identifier == "ContentLength" ? @" + if (ContentLength.HasValue) + { + ThrowDuplicateKeyException(); + } + else + { + ContentLength = ParseContentLength(value); + }" : $@" if ({header.TestBit()}) {{ ThrowDuplicateKeyException(); - }}{ - If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = ParseContentLength(value);")} + }} {header.SetBit()}; _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" - _headers._raw{header.Identifier} = null;")} + _headers._raw{header.Identifier} = null;")}")} return; }} ")}}} @@ -420,10 +482,18 @@ protected override bool RemoveFast(string key) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{ + {{{(header.Identifier == "ContentLength" ? @" + if (ContentLength.HasValue) + { + ContentLength = null; + return true; + } + else + { + return false; + }" : $@" if ({header.TestBit()}) - {{{If(loop.ClassName == "FrameResponseHeaders" && header.Identifier == "ContentLength", () => @" - _contentLength = null;")} + {{ {header.ClearBit()}; _headers._{header.Identifier} = StringValues.Empty;{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")} @@ -432,7 +502,7 @@ protected override bool RemoveFast(string key) else {{ return false; - }} + }}")} }} ")}}} break; @@ -442,14 +512,14 @@ protected override bool RemoveFast(string key) protected override void ClearFast() {{ MaybeUnknown?.Clear(); - {(loop.ClassName == "FrameResponseHeaders" ? "_contentLength = null;" : "")} - if(FrameHeaders.BitCount(_bits) > 12) + ContentLength = null; + if(FrameHeaders.BitCount(_bits) > 11) {{ _headers = default(HeaderReferences); _bits = 0; return; }} - {Each(loop.Headers.OrderBy(h => !h.PrimaryHeader), header => $@" + {Each(loop.Headers.Where(header => header.Index >= 0).OrderBy(h => !h.PrimaryHeader), header => $@" if ({header.TestBit()}) {{ _headers._{header.Identifier} = default(StringValues); @@ -468,7 +538,7 @@ protected override void CopyToFast(KeyValuePair[] array, i {{ ThrowArgumentException(); }} - {Each(loop.Headers, header => $@" + {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" if ({header.TestBit()}) {{ if (arrayIndex == array.Length) @@ -478,15 +548,36 @@ protected override void CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair(""{header.Name}"", _headers._{header.Identifier}); ++arrayIndex; + }}")} + if (ContentLength.HasValue) + {{ + if (arrayIndex == array.Length) + {{ + ThrowArgumentException(); + }} + + array[arrayIndex] = new KeyValuePair(""Content-Length"", ContentLength.ToString()); + ++arrayIndex; }} - ")} ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); }} {(loop.ClassName == "FrameResponseHeaders" ? $@" protected void CopyToFast(ref MemoryPoolIterator output) {{ - var tempBits = _bits; + var tempBits = _bits | (ContentLength.HasValue ? {1L << 63}L : 0); {Each(loop.Headers.OrderBy(h => !h.PrimaryHeader), header => $@" + {(header.Identifier == "ContentLength" ? $@" + if (ContentLength.HasValue) + {{ + output.CopyFrom(_headerBytes, {header.BytesOffset}, {header.BytesCount}); + output.CopyFromNumeric(ContentLength.Value); + + tempBits &= ~{1L << 63}L; + if(tempBits == 0) + {{ + return; + }} + }}" : $@" if ({header.TestBit()}) {{ {(header.EnhancedSetter == false ? "" : $@" if (_headers._raw{header.Identifier} != null) @@ -512,7 +603,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) {{ return; }} - }} + }}")} ")} }} @@ -535,7 +626,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int Unknown[key] = AppendValue(existing, value); }}" : "")} private struct HeaderReferences - {{{Each(loop.Headers, header => @" + {{{Each(loop.Headers.Where(header => header.Index >= 0), header => @" public StringValues _" + header.Identifier + ";")} {Each(loop.Headers.Where(header => header.EnhancedSetter), header => @" public byte[] _raw" + header.Identifier + ";")} @@ -547,14 +638,16 @@ public bool MoveNext() {{ switch (_state) {{ - {Each(loop.Headers, header => $@" - case {header.Index}: - goto state{header.Index}; + {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" + case {header.Index}: + goto state{header.Index}; ")} + case {loop.Headers.Count()}: + goto state{loop.Headers.Count()}; default: goto state_default; }} - {Each(loop.Headers, header => $@" + {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" state{header.Index}: if ({header.TestBit()}) {{ @@ -563,6 +656,13 @@ public bool MoveNext() return true; }} ")} + state{loop.Headers.Count()}: + if (_collection.ContentLength.HasValue) + {{ + _current = new KeyValuePair(""Content-Length"", _collection.ContentLength.ToString()); + _state = {loop.Headers.Count() + 1}; + return true; + }} state_default: if (!_hasUnknown || !_unknownEnumerator.MoveNext()) {{ From bc2cb10e8ead7cd8899ddc105342d4407452dcb1 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 20 Jan 2017 08:06:42 +0000 Subject: [PATCH 02/18] Zero contentLength msgbody doesn't need state --- .../Internal/Http/MessageBody.cs | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs index c67135711..6cc21f083 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs @@ -8,12 +8,14 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Internal; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { public abstract class MessageBody { + private static readonly MessageBody _zeroContentLengthClose = new ForZeroContentLength(keepAlive: false); + private static readonly MessageBody _zeroContentLengthKeepAlive = new ForZeroContentLength(keepAlive: true); + private readonly Frame _context; private bool _send100Continue = true; @@ -268,7 +270,13 @@ public static MessageBody For( if (headers.ContentLength.HasValue) { - return new ForContentLength(keepAlive, headers.ContentLength.Value, context); + var contentLength = headers.ContentLength.Value; + if (contentLength == 0) + { + return keepAlive ? _zeroContentLengthKeepAlive : _zeroContentLengthClose; + } + + return new ForContentLength(keepAlive, contentLength, context); } // Avoid slowing down most common case @@ -283,7 +291,7 @@ public static MessageBody For( } } - return new ForContentLength(keepAlive, 0, context); + return keepAlive ? _zeroContentLengthKeepAlive : _zeroContentLengthClose; } private class ForRemainingData : MessageBody @@ -300,6 +308,28 @@ protected override ValueTask> PeekAsync(CancellationToken can } } + private class ForZeroContentLength : MessageBody + { + public ForZeroContentLength(bool keepAlive) + : base(null) + { + RequestKeepAlive = keepAlive; + } + + protected override ValueTask> PeekAsync(CancellationToken cancellationToken) + { + return new ValueTask>(); + } + + protected override void OnConsumedBytes(int count) + { + if (count > 0) + { + throw new InvalidDataException("Consuming non-existant data"); + } + } + } + private class ForContentLength : MessageBody { private readonly long _contentLength; From e2615b226b4839851944b0ec6813c3d918c9efb2 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 20 Jan 2017 14:13:25 +0000 Subject: [PATCH 03/18] Remove HasContentLength prop --- .../Internal/Http/Frame.cs | 6 +++--- .../Internal/Http/FrameResponseHeaders.cs | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs index 377a1e598..e72549c71 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/Frame.cs @@ -656,7 +656,7 @@ private void VerifyAndUpdateWrite(int count) if (responseHeaders != null && !responseHeaders.HasTransferEncoding && - responseHeaders.HasContentLength && + responseHeaders.ContentLength.HasValue && _responseBytesWritten + count > responseHeaders.ContentLength.Value) { _keepAlive = false; @@ -678,7 +678,7 @@ private void CheckLastWrite() // Called after VerifyAndUpdateWrite(), so _responseBytesWritten has already been updated. if (responseHeaders != null && !responseHeaders.HasTransferEncoding && - responseHeaders.HasContentLength && + responseHeaders.ContentLength.HasValue && _responseBytesWritten == responseHeaders.ContentLength.Value) { _abortedCts = null; @@ -919,7 +919,7 @@ private void CreateResponseHeader( // automatically for HEAD requests or 204, 205, 304 responses. if (_canHaveBody) { - if (!hasTransferEncoding && !responseHeaders.HasContentLength) + if (!hasTransferEncoding && !responseHeaders.ContentLength.HasValue) { if (appCompleted && StatusCode != StatusCodes.Status101SwitchingProtocols) { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs index 96012c0ad..e711ef6f2 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs @@ -17,8 +17,6 @@ public partial class FrameResponseHeaders : FrameHeaders public bool HasTransferEncoding => HeaderTransferEncoding.Count != 0; - public bool HasContentLength => ContentLength.HasValue; - public bool HasServer => HeaderServer.Count != 0; public bool HasDate => HeaderDate.Count != 0; From 6a0c9221fe88447338f4e51614fa4f50774e2585 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 20 Jan 2017 19:33:05 +0000 Subject: [PATCH 04/18] Throw correct exception, FormatInt64, test --- .../Internal/Http/FrameHeaders.Generated.cs | 37 ++++++------ .../Internal/Http/FrameHeaders.cs | 22 ++++++- .../BadHttpRequestTests.cs | 13 +++++ .../KnownHeaders.cs | 57 ++++++++++--------- 4 files changed, 80 insertions(+), 49 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index cd4ef1173..3bd6ba709 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { @@ -709,13 +710,13 @@ public StringValues HeaderContentLength { if (ContentLength.HasValue) { - return ContentLength.ToString(); + return HeaderUtilities.FormatInt64(ContentLength.Value); } return StringValues.Empty; } set { - ContentLength = ParseContentLength(value); + ContentLength = ParseRequestContentLength(value); } } @@ -1162,7 +1163,7 @@ protected override StringValues GetValueFast(string key) { if (ContentLength.HasValue) { - return ContentLength.ToString(); + return HeaderUtilities.FormatInt64(ContentLength.Value); } else { @@ -1835,7 +1836,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if (ContentLength.HasValue) { - value = ContentLength.ToString(); + value = HeaderUtilities.FormatInt64(ContentLength.Value); return true; } else @@ -2302,7 +2303,7 @@ protected override void SetValueFast(string key, StringValues value) if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - ContentLength = ParseContentLength(value); + ContentLength = ParseRequestContentLength(value); return; } } @@ -2831,7 +2832,7 @@ protected override void AddValueFast(string key, StringValues value) } else { - ContentLength = ParseContentLength(value); + ContentLength = ParseRequestContentLength(value); } return; } @@ -4563,7 +4564,7 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Length", ContentLength.ToString()); + array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -5122,11 +5123,11 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if (ContentLength.HasValue) { - ThrowInvalidContentLengthException(AppendValue(ContentLength.ToString(), value).ToString()); + ThrowInvalidRequestContentLengthException(AppendValue(HeaderUtilities.FormatInt64(ContentLength.Value), value).ToString()); } else { - ContentLength = ParseContentLength(value); + ContentLength = ParseRequestContentLength(value); } return; } @@ -5855,7 +5856,7 @@ public bool MoveNext() state44: if (_collection.ContentLength.HasValue) { - _current = new KeyValuePair("Content-Length", _collection.ContentLength.ToString()); + _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); _state = 45; return true; } @@ -6451,13 +6452,13 @@ public StringValues HeaderContentLength { if (ContentLength.HasValue) { - return ContentLength.ToString(); + return HeaderUtilities.FormatInt64(ContentLength.Value); } return StringValues.Empty; } set { - ContentLength = ParseContentLength(value); + ContentLength = ParseResponseContentLength(value); } } @@ -6973,7 +6974,7 @@ protected override StringValues GetValueFast(string key) { if (ContentLength.HasValue) { - return ContentLength.ToString(); + return HeaderUtilities.FormatInt64(ContentLength.Value); } else { @@ -7561,7 +7562,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if (ContentLength.HasValue) { - value = ContentLength.ToString(); + value = HeaderUtilities.FormatInt64(ContentLength.Value); return true; } else @@ -7906,7 +7907,7 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - ContentLength = ParseContentLength(value); + ContentLength = ParseResponseContentLength(value); return; } } @@ -8391,7 +8392,7 @@ protected override void AddValueFast(string key, StringValues value) } else { - ContentLength = ParseContentLength(value); + ContentLength = ParseResponseContentLength(value); } return; } @@ -9717,7 +9718,7 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); } - array[arrayIndex] = new KeyValuePair("Content-Length", ContentLength.ToString()); + array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -11014,7 +11015,7 @@ public bool MoveNext() state36: if (_collection.ContentLength.HasValue) { - _current = new KeyValuePair("Content-Length", _collection.ContentLength.ToString()); + _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); _state = 37; return true; } diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index a9fa4bb6e..7d00c97fc 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -236,12 +236,23 @@ public static void ValidateHeaderCharacters(string headerCharacters) } } - public static long ParseContentLength(string value) + public static long ParseRequestContentLength(string value) { long parsed; if (!HeaderUtilities.TryParseInt64(value, out parsed)) { - ThrowInvalidContentLengthException(value); + ThrowInvalidRequestContentLengthException(value); + } + + return parsed; + } + + public static long ParseResponseContentLength(string value) + { + long parsed; + if (!HeaderUtilities.TryParseInt64(value, out parsed)) + { + ThrowInvalidResponseContentLengthException(value); } return parsed; @@ -413,11 +424,16 @@ public static unsafe TransferCoding GetFinalTransferCoding(StringValues transfer return transferEncodingOptions; } - protected static void ThrowInvalidContentLengthException(string value) + protected static void ThrowInvalidResponseContentLengthException(string value) { throw new InvalidOperationException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); } + protected static void ThrowInvalidRequestContentLengthException(string value) + { + throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidContentLength, value); + } + private static void ThrowInvalidHeaderCharacter(char ch) { throw new InvalidOperationException(string.Format("Invalid non-ASCII or control character in header: 0x{0:X4}", (ushort)ch)); diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs index b211578da..73857d784 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs @@ -202,6 +202,19 @@ public async Task BadRequestIfMethodRequiresLengthButNoContentLengthInHttp10Requ } } + [Fact] + public async Task BadRequestIfContentLengthInvalid() + { + using (var server = new TestServer(context => { return Task.FromResult(0); })) + { + using (var connection = server.CreateConnection()) + { + await connection.Send("GET / HTTP/1.1\r\nContent-Length: NaN\r\n\r\n"); + await ReceiveBadRequestResponse(connection, "400 Bad Request", server.Context.DateHeaderValue); + } + } + } + private async Task ReceiveBadRequestResponse(TestConnection connection, string expectedResponseStatusCode, string expectedDateHeaderValue) { await connection.ReceiveForcedEnd( diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 45f816055..910bb675d 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -31,15 +31,15 @@ static string AppendSwitch(IEnumerable> values, stri case {byLength.Key}: {{{Each(byLength, header => $@" if ({header.EqualIgnoreCaseBytes()}) - {{{(header.Identifier == "ContentLength" ? @" + {{{(header.Identifier == "ContentLength" ? $@" if (ContentLength.HasValue) - { - ThrowInvalidContentLengthException(AppendValue(ContentLength.ToString(), value).ToString()); - } + {{ + ThrowInvalid{(className == "FrameResponseHeaders" ? "Response" : "Request")}ContentLengthException(AppendValue(HeaderUtilities.FormatInt64(ContentLength.Value), value).ToString()); + }} else - { - ContentLength = ParseContentLength(value); - } + {{ + ContentLength = Parse{(className == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + }} return;" : $@" if ({header.TestBit()}) {{ @@ -297,6 +297,7 @@ public static string GeneratedFile() using System.Collections.Generic; using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http {{ @@ -314,19 +315,19 @@ public partial class {loop.ClassName} private HeaderReferences _headers; {Each(loop.Headers, header => $@" public StringValues Header{header.Identifier} - {{{(header.Identifier == "ContentLength" ? @" + {{{(header.Identifier == "ContentLength" ? $@" get - { + {{ if (ContentLength.HasValue) - { - return ContentLength.ToString(); - } + {{ + return HeaderUtilities.FormatInt64(ContentLength.Value); + }} return StringValues.Empty; - } + }} set - { - ContentLength = ParseContentLength(value); - }" : $@" + {{ + ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + }}" : $@" get {{ if ({header.TestBit()}) @@ -363,7 +364,7 @@ protected override StringValues GetValueFast(string key) {{{(header.Identifier == "ContentLength" ? @" if (ContentLength.HasValue) { - return ContentLength.ToString(); + return HeaderUtilities.FormatInt64(ContentLength.Value); } else { @@ -397,7 +398,7 @@ protected override bool TryGetValueFast(string key, out StringValues value) {{{(header.Identifier == "ContentLength" ? @" if (ContentLength.HasValue) { - value = ContentLength.ToString(); + value = HeaderUtilities.FormatInt64(ContentLength.Value); return true; } else @@ -430,8 +431,8 @@ protected override void SetValueFast(string key, StringValues value) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{{(header.Identifier == "ContentLength" ? @" - ContentLength = ParseContentLength(value);" : $@" + {{{(header.Identifier == "ContentLength" ? $@" + ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value);" : $@" {header.SetBit()}; _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")}")} @@ -451,15 +452,15 @@ protected override void AddValueFast(string key, StringValues value) case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{{(header.Identifier == "ContentLength" ? @" + {{{(header.Identifier == "ContentLength" ? $@" if (ContentLength.HasValue) - { + {{ ThrowDuplicateKeyException(); - } + }} else - { - ContentLength = ParseContentLength(value); - }" : $@" + {{ + ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + }}" : $@" if ({header.TestBit()}) {{ ThrowDuplicateKeyException(); @@ -556,7 +557,7 @@ protected override void CopyToFast(KeyValuePair[] array, i ThrowArgumentException(); }} - array[arrayIndex] = new KeyValuePair(""Content-Length"", ContentLength.ToString()); + array[arrayIndex] = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; }} ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -659,7 +660,7 @@ public bool MoveNext() state{loop.Headers.Count()}: if (_collection.ContentLength.HasValue) {{ - _current = new KeyValuePair(""Content-Length"", _collection.ContentLength.ToString()); + _current = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); _state = {loop.Headers.Count() + 1}; return true; }} From 4718d29375ff482d66dd64510b68079b9a8c1b25 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 21 Jan 2017 04:30:30 +0000 Subject: [PATCH 05/18] Add extra contentlength tests --- .../Internal/Http/FrameHeaders.Generated.cs | 2 +- .../Internal/Http/FrameHeaders.cs | 18 +++- .../Infrastructure/MemoryPoolIterator.cs | 12 ++- .../FrameHeadersTests.cs | 63 ++++++++++++ .../FrameRequestHeadersTests.cs | 95 +++++++++++++++---- .../KnownHeaders.cs | 2 +- 6 files changed, 168 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index 3bd6ba709..cdfaa42b2 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -9839,7 +9839,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) if (ContentLength.HasValue) { output.CopyFrom(_headerBytes, 592, 18); - output.CopyFromNumeric(ContentLength.Value); + output.CopyFromNumeric((ulong)ContentLength.Value); tempBits &= ~-9223372036854775808L; if(tempBits == 0) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index 7d00c97fc..c11438951 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -13,11 +13,22 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { public abstract class FrameHeaders : IHeaderDictionary { + private long? _contentLength; protected bool _isReadOnly; protected Dictionary MaybeUnknown; protected Dictionary Unknown => MaybeUnknown ?? (MaybeUnknown = new Dictionary(StringComparer.OrdinalIgnoreCase)); - public long? ContentLength { get; set; } + public long? ContentLength { + get { return _contentLength; } + set + { + if (value.HasValue && value.Value < 0) + { + ThrowInvalidResponseContentLengthException(value.Value); + } + _contentLength = value; + } + } StringValues IHeaderDictionary.this[string key] { @@ -424,6 +435,11 @@ public static unsafe TransferCoding GetFinalTransferCoding(StringValues transfer return transferEncodingOptions; } + protected static void ThrowInvalidResponseContentLengthException(long value) + { + throw new ArgumentOutOfRangeException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); + } + protected static void ThrowInvalidResponseContentLengthException(string value) { throw new InvalidOperationException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs index 264e29657..4a9a37137 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure { public struct MemoryPoolIterator { - private const int _maxPositiveLongByteLength = 19; + private const int _maxULongByteLength = 20; private const ulong _xorPowerOfTwoToHighByte = (0x07ul | 0x06ul << 8 | 0x05ul << 16 | @@ -1091,12 +1091,14 @@ public unsafe void CopyFromAscii(string data) [MethodImpl(MethodImplOptions.NoInlining)] private static byte[] CreateNumericBytesScratch() { - return (_numericBytesScratch = new byte[_maxPositiveLongByteLength]); + var bytes = new byte[_maxULongByteLength]; + _numericBytesScratch = bytes; + return bytes; } - public void CopyFromNumeric(long value) + public void CopyFromNumeric(ulong value) { - var position = _maxPositiveLongByteLength; + var position = _maxULongByteLength; var byteBuffer = NumericBytesScratch; do { @@ -1107,7 +1109,7 @@ public void CopyFromNumeric(long value) } while (value != 0); - CopyFrom(byteBuffer, position, _maxPositiveLongByteLength - position); + CopyFrom(byteBuffer, position, _maxULongByteLength - position); } public unsafe string GetAsciiString(ref MemoryPoolIterator end) diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameHeadersTests.cs index 6e41b778e..83856879a 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameHeadersTests.cs @@ -1,8 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Collections.Generic; using Microsoft.AspNetCore.Server.Kestrel.Internal.Http; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; using Xunit; namespace Microsoft.AspNetCore.Server.KestrelTests @@ -223,5 +226,65 @@ public void TestParseTransferEncodingMultipleValues(string value1, string value2 var transferEncodingOptions = FrameHeaders.GetFinalTransferCoding(transferEncoding); Assert.Equal(expectedTransferEncodingOptions, transferEncodingOptions); } + + [Fact] + public void ValidContentLengthsAccepted() + { + ValidContentLengthsAccepted(new FrameRequestHeaders()); + ValidContentLengthsAccepted(new FrameResponseHeaders()); + } + + private static void ValidContentLengthsAccepted(FrameHeaders frameHeaders) + { + IDictionary headers = frameHeaders; + + StringValues value; + + Assert.False(headers.TryGetValue("Content-Length", out value)); + Assert.Equal(null, frameHeaders.ContentLength); + Assert.False(frameHeaders.ContentLength.HasValue); + + frameHeaders.ContentLength = 1; + Assert.True(headers.TryGetValue("Content-Length", out value)); + Assert.Equal("1", value[0]); + Assert.Equal(1, frameHeaders.ContentLength); + Assert.True(frameHeaders.ContentLength.HasValue); + + frameHeaders.ContentLength = long.MaxValue; + Assert.True(headers.TryGetValue("Content-Length", out value)); + Assert.Equal(HeaderUtilities.FormatInt64(long.MaxValue), value[0]); + Assert.Equal(long.MaxValue, frameHeaders.ContentLength); + Assert.True(frameHeaders.ContentLength.HasValue); + + frameHeaders.ContentLength = null; + Assert.False(headers.TryGetValue("Content-Length", out value)); + Assert.Equal(null, frameHeaders.ContentLength); + Assert.False(frameHeaders.ContentLength.HasValue); + } + + [Fact] + public void InvalidContentLengthsRejected() + { + InvalidContentLengthsRejected(new FrameRequestHeaders()); + InvalidContentLengthsRejected(new FrameResponseHeaders()); + } + + private static void InvalidContentLengthsRejected(FrameHeaders frameHeaders) + { + IDictionary headers = frameHeaders; + + StringValues value; + + Assert.False(headers.TryGetValue("Content-Length", out value)); + Assert.Equal(null, frameHeaders.ContentLength); + Assert.False(frameHeaders.ContentLength.HasValue); + + Assert.Throws(() => frameHeaders.ContentLength = -1); + Assert.Throws(() => frameHeaders.ContentLength = long.MinValue); + + Assert.False(headers.TryGetValue("Content-Length", out value)); + Assert.Equal(null, frameHeaders.ContentLength); + Assert.False(frameHeaders.ContentLength.HasValue); + } } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameRequestHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameRequestHeadersTests.cs index b19ca0712..91212d627 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameRequestHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameRequestHeadersTests.cs @@ -41,10 +41,14 @@ public void SettingKnownHeadersWorks() IDictionary headers = new FrameRequestHeaders(); headers["host"] = new[] { "value" }; + headers["content-length"] = new[] { "0" }; Assert.NotNull(headers["host"]); + Assert.NotNull(headers["content-length"]); Assert.Equal(1, headers["host"].Count); + Assert.Equal(1, headers["content-length"].Count); Assert.Equal("value", headers["host"][0]); + Assert.Equal("0", headers["content-length"][0]); } [Fact] @@ -54,8 +58,9 @@ public void KnownAndCustomHeaderCountAddedTogether() headers["host"] = new[] { "value" }; headers["custom"] = new[] { "value" }; + headers["Content-Length"] = new[] { "0" }; - Assert.Equal(2, headers.Count); + Assert.Equal(3, headers.Count); } [Fact] @@ -66,14 +71,22 @@ public void TryGetValueWorksForKnownAndUnknownHeaders() StringValues value; Assert.False(headers.TryGetValue("host", out value)); Assert.False(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); headers["host"] = new[] { "value" }; Assert.True(headers.TryGetValue("host", out value)); Assert.False(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); headers["custom"] = new[] { "value" }; Assert.True(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); + + headers["Content-Length"] = new[] { "0" }; + Assert.True(headers.TryGetValue("host", out value)); + Assert.True(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); } [Fact] @@ -83,6 +96,7 @@ public void SameExceptionThrownForMissingKey() Assert.Throws(() => headers["custom"]); Assert.Throws(() => headers["host"]); + Assert.Throws(() => headers["Content-Length"]); } [Fact] @@ -90,14 +104,17 @@ public void EntriesCanBeEnumerated() { IDictionary headers = new FrameRequestHeaders(); var v1 = new[] { "localhost" }; - var v2 = new[] { "value" }; + var v2 = new[] { "0" }; + var v3 = new[] { "value" }; headers["host"] = v1; - headers["custom"] = v2; + headers["Content-Length"] = v2; + headers["custom"] = v3; Assert.Equal( new[] { new KeyValuePair("Host", v1), - new KeyValuePair("custom", v2), + new KeyValuePair("Content-Length", v2), + new KeyValuePair("custom", v3), }, headers); } @@ -107,16 +124,18 @@ public void KeysAndValuesCanBeEnumerated() { IDictionary headers = new FrameRequestHeaders(); StringValues v1 = new[] { "localhost" }; - StringValues v2 = new[] { "value" }; + StringValues v2 = new[] { "0" }; + StringValues v3 = new[] { "value" }; headers["host"] = v1; - headers["custom"] = v2; + headers["Content-Length"] = v2; + headers["custom"] = v3; Assert.Equal( - new[] { "Host", "custom" }, + new[] { "Host", "Content-Length", "custom" }, headers.Keys); Assert.Equal( - new[] { v1, v2 }, + new[] { v1, v2, v3 }, headers.Values); } @@ -126,29 +145,50 @@ public void ContainsAndContainsKeyWork() IDictionary headers = new FrameRequestHeaders(); var kv1 = new KeyValuePair("host", new[] { "localhost" }); var kv2 = new KeyValuePair("custom", new[] { "value" }); + var kv3 = new KeyValuePair("Content-Length", new[] { "0" }); var kv1b = new KeyValuePair("host", new[] { "not-localhost" }); var kv2b = new KeyValuePair("custom", new[] { "not-value" }); + var kv3b = new KeyValuePair("Content-Length", new[] { "1" }); Assert.False(headers.ContainsKey("host")); Assert.False(headers.ContainsKey("custom")); + Assert.False(headers.ContainsKey("Content-Length")); Assert.False(headers.Contains(kv1)); Assert.False(headers.Contains(kv2)); + Assert.False(headers.Contains(kv3)); headers["host"] = kv1.Value; Assert.True(headers.ContainsKey("host")); Assert.False(headers.ContainsKey("custom")); + Assert.False(headers.ContainsKey("Content-Length")); Assert.True(headers.Contains(kv1)); Assert.False(headers.Contains(kv2)); + Assert.False(headers.Contains(kv3)); Assert.False(headers.Contains(kv1b)); Assert.False(headers.Contains(kv2b)); + Assert.False(headers.Contains(kv3b)); headers["custom"] = kv2.Value; Assert.True(headers.ContainsKey("host")); Assert.True(headers.ContainsKey("custom")); + Assert.False(headers.ContainsKey("Content-Length")); + Assert.True(headers.Contains(kv1)); + Assert.True(headers.Contains(kv2)); + Assert.False(headers.Contains(kv3)); + Assert.False(headers.Contains(kv1b)); + Assert.False(headers.Contains(kv2b)); + Assert.False(headers.Contains(kv3b)); + + headers["Content-Length"] = kv3.Value; + Assert.True(headers.ContainsKey("host")); + Assert.True(headers.ContainsKey("custom")); + Assert.True(headers.ContainsKey("Content-Length")); Assert.True(headers.Contains(kv1)); Assert.True(headers.Contains(kv2)); + Assert.True(headers.Contains(kv3)); Assert.False(headers.Contains(kv1b)); Assert.False(headers.Contains(kv2b)); + Assert.False(headers.Contains(kv3b)); } [Fact] @@ -159,16 +199,21 @@ public void AddWorksLikeSetAndThrowsIfKeyExists() StringValues value; Assert.False(headers.TryGetValue("host", out value)); Assert.False(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); headers.Add("host", new[] { "localhost" }); headers.Add("custom", new[] { "value" }); + headers.Add("Content-Length", new[] { "0" }); Assert.True(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); Assert.Throws(() => headers.Add("host", new[] { "localhost" })); Assert.Throws(() => headers.Add("custom", new[] { "value" })); + Assert.Throws(() => headers.Add("Content-Length", new[] { "0" })); Assert.True(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); } [Fact] @@ -177,17 +222,20 @@ public void ClearRemovesAllHeaders() IDictionary headers = new FrameRequestHeaders(); headers.Add("host", new[] { "localhost" }); headers.Add("custom", new[] { "value" }); + headers.Add("Content-Length", new[] { "0" }); StringValues value; - Assert.Equal(2, headers.Count); + Assert.Equal(3, headers.Count); Assert.True(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); headers.Clear(); Assert.Equal(0, headers.Count); Assert.False(headers.TryGetValue("host", out value)); Assert.False(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); } [Fact] @@ -196,25 +244,36 @@ public void RemoveTakesHeadersOutOfDictionary() IDictionary headers = new FrameRequestHeaders(); headers.Add("host", new[] { "localhost" }); headers.Add("custom", new[] { "value" }); + headers.Add("Content-Length", new[] { "0" }); StringValues value; - Assert.Equal(2, headers.Count); + Assert.Equal(3, headers.Count); Assert.True(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); Assert.True(headers.Remove("host")); Assert.False(headers.Remove("host")); - Assert.Equal(1, headers.Count); + Assert.Equal(2, headers.Count); Assert.False(headers.TryGetValue("host", out value)); Assert.True(headers.TryGetValue("custom", out value)); Assert.True(headers.Remove("custom")); Assert.False(headers.Remove("custom")); + Assert.Equal(1, headers.Count); + Assert.False(headers.TryGetValue("host", out value)); + Assert.False(headers.TryGetValue("custom", out value)); + Assert.True(headers.TryGetValue("Content-Length", out value)); + + Assert.True(headers.Remove("Content-Length")); + Assert.False(headers.Remove("Content-Length")); + Assert.Equal(0, headers.Count); Assert.False(headers.TryGetValue("host", out value)); Assert.False(headers.TryGetValue("custom", out value)); + Assert.False(headers.TryGetValue("Content-Length", out value)); } [Fact] @@ -222,9 +281,10 @@ public void CopyToMovesDataIntoArray() { IDictionary headers = new FrameRequestHeaders(); headers.Add("host", new[] { "localhost" }); + headers.Add("Content-Length", new[] { "0" }); headers.Add("custom", new[] { "value" }); - var entries = new KeyValuePair[4]; + var entries = new KeyValuePair[5]; headers.CopyTo(entries, 1); Assert.Null(entries[0].Key); @@ -233,11 +293,14 @@ public void CopyToMovesDataIntoArray() Assert.Equal("Host", entries[1].Key); Assert.Equal(new[] { "localhost" }, entries[1].Value); - Assert.Equal("custom", entries[2].Key); - Assert.Equal(new[] { "value" }, entries[2].Value); + Assert.Equal("Content-Length", entries[2].Key); + Assert.Equal(new[] { "0" }, entries[2].Value); - Assert.Null(entries[3].Key); - Assert.Equal(new StringValues(), entries[0].Value); + Assert.Equal("custom", entries[3].Key); + Assert.Equal(new[] { "value" }, entries[3].Value); + + Assert.Null(entries[4].Key); + Assert.Equal(new StringValues(), entries[4].Value); } [Fact] diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 910bb675d..a3de5afee 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -571,7 +571,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) if (ContentLength.HasValue) {{ output.CopyFrom(_headerBytes, {header.BytesOffset}, {header.BytesCount}); - output.CopyFromNumeric(ContentLength.Value); + output.CopyFromNumeric((ulong)ContentLength.Value); tempBits &= ~{1L << 63}L; if(tempBits == 0) From 421d1a1e4946ea6e8e2907345870b1eafec68a3d Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 21 Jan 2017 17:10:40 +0000 Subject: [PATCH 06/18] Throw multiple content lengths --- .../BadHttpRequestException.cs | 3 +++ .../Internal/Http/FrameHeaders.Generated.cs | 2 +- .../Internal/Http/FrameHeaders.cs | 5 +++++ .../Internal/Http/RequestRejectionReason.cs | 1 + .../KnownHeaders.cs | 4 ++-- 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs b/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs index 128040c1d..b854cc8dd 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs @@ -43,6 +43,9 @@ internal static BadHttpRequestException GetException(RequestRejectionReason reas case RequestRejectionReason.MalformedRequestInvalidHeaders: ex = new BadHttpRequestException("Malformed request: invalid headers.", StatusCodes.Status400BadRequest); break; + case RequestRejectionReason.MultipleContentLengths: + ex = new BadHttpRequestException("Multiple content length headers.", StatusCodes.Status400BadRequest); + break; case RequestRejectionReason.UnexpectedEndOfRequestContent: ex = new BadHttpRequestException("Unexpected end of request content.", StatusCodes.Status400BadRequest); break; diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index cdfaa42b2..c61182b5e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -5123,7 +5123,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if (ContentLength.HasValue) { - ThrowInvalidRequestContentLengthException(AppendValue(HeaderUtilities.FormatInt64(ContentLength.Value), value).ToString()); + ThrowRequestMultipleContentLengths(); } else { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index c11438951..557c6249e 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -450,6 +450,11 @@ protected static void ThrowInvalidRequestContentLengthException(string value) throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidContentLength, value); } + protected static void ThrowRequestMultipleContentLengths() + { + throw BadHttpRequestException.GetException(RequestRejectionReason.MultipleContentLengths); + } + private static void ThrowInvalidHeaderCharacter(char ch) { throw new InvalidOperationException(string.Format("Invalid non-ASCII or control character in header: 0x{0:X4}", (ushort)ch)); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/RequestRejectionReason.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/RequestRejectionReason.cs index 0c05a6b8e..caa6475d9 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/RequestRejectionReason.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/RequestRejectionReason.cs @@ -15,6 +15,7 @@ public enum RequestRejectionReason InvalidRequestLine, MalformedRequestInvalidHeaders, InvalidContentLength, + MultipleContentLengths, UnexpectedEndOfRequestContent, BadChunkSuffix, BadChunkSizeData, diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index a3de5afee..299ef0462 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -34,11 +34,11 @@ static string AppendSwitch(IEnumerable> values, stri {{{(header.Identifier == "ContentLength" ? $@" if (ContentLength.HasValue) {{ - ThrowInvalid{(className == "FrameResponseHeaders" ? "Response" : "Request")}ContentLengthException(AppendValue(HeaderUtilities.FormatInt64(ContentLength.Value), value).ToString()); + ThrowRequestMultipleContentLengths(); }} else {{ - ContentLength = Parse{(className == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + ContentLength = ParseRequestContentLength(value); }} return;" : $@" if ({header.TestBit()}) From 85a665554ac83db2c1dc79e4b4b36b3dbbc8f23d Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 21 Jan 2017 19:47:05 +0000 Subject: [PATCH 07/18] Cleanup headers --- .../Internal/Http/FrameHeaders.Generated.cs | 6579 ++++++----------- .../Internal/Http/FrameHeaders.cs | 25 +- .../KnownHeaders.cs | 225 +- 3 files changed, 2423 insertions(+), 4406 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index c61182b5e..c81ad7951 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -20,11 +20,12 @@ public StringValues HeaderCacheControl { get { - if (((_bits & 1L) != 0)) + StringValues value; + if ((_bits & 1L) != 0) { - return _headers._CacheControl; + value = _headers._CacheControl; } - return StringValues.Empty; + return value; } set { @@ -36,11 +37,12 @@ public StringValues HeaderConnection { get { - if (((_bits & 2L) != 0)) + StringValues value; + if ((_bits & 2L) != 0) { - return _headers._Connection; + value = _headers._Connection; } - return StringValues.Empty; + return value; } set { @@ -52,11 +54,12 @@ public StringValues HeaderDate { get { - if (((_bits & 4L) != 0)) + StringValues value; + if ((_bits & 4L) != 0) { - return _headers._Date; + value = _headers._Date; } - return StringValues.Empty; + return value; } set { @@ -68,11 +71,12 @@ public StringValues HeaderKeepAlive { get { - if (((_bits & 8L) != 0)) + StringValues value; + if ((_bits & 8L) != 0) { - return _headers._KeepAlive; + value = _headers._KeepAlive; } - return StringValues.Empty; + return value; } set { @@ -84,11 +88,12 @@ public StringValues HeaderPragma { get { - if (((_bits & 16L) != 0)) + StringValues value; + if ((_bits & 16L) != 0) { - return _headers._Pragma; + value = _headers._Pragma; } - return StringValues.Empty; + return value; } set { @@ -100,11 +105,12 @@ public StringValues HeaderTrailer { get { - if (((_bits & 32L) != 0)) + StringValues value; + if ((_bits & 32L) != 0) { - return _headers._Trailer; + value = _headers._Trailer; } - return StringValues.Empty; + return value; } set { @@ -116,11 +122,12 @@ public StringValues HeaderTransferEncoding { get { - if (((_bits & 64L) != 0)) + StringValues value; + if ((_bits & 64L) != 0) { - return _headers._TransferEncoding; + value = _headers._TransferEncoding; } - return StringValues.Empty; + return value; } set { @@ -132,11 +139,12 @@ public StringValues HeaderUpgrade { get { - if (((_bits & 128L) != 0)) + StringValues value; + if ((_bits & 128L) != 0) { - return _headers._Upgrade; + value = _headers._Upgrade; } - return StringValues.Empty; + return value; } set { @@ -148,11 +156,12 @@ public StringValues HeaderVia { get { - if (((_bits & 256L) != 0)) + StringValues value; + if ((_bits & 256L) != 0) { - return _headers._Via; + value = _headers._Via; } - return StringValues.Empty; + return value; } set { @@ -164,11 +173,12 @@ public StringValues HeaderWarning { get { - if (((_bits & 512L) != 0)) + StringValues value; + if ((_bits & 512L) != 0) { - return _headers._Warning; + value = _headers._Warning; } - return StringValues.Empty; + return value; } set { @@ -180,11 +190,12 @@ public StringValues HeaderAllow { get { - if (((_bits & 1024L) != 0)) + StringValues value; + if ((_bits & 1024L) != 0) { - return _headers._Allow; + value = _headers._Allow; } - return StringValues.Empty; + return value; } set { @@ -196,11 +207,12 @@ public StringValues HeaderContentType { get { - if (((_bits & 2048L) != 0)) + StringValues value; + if ((_bits & 2048L) != 0) { - return _headers._ContentType; + value = _headers._ContentType; } - return StringValues.Empty; + return value; } set { @@ -212,11 +224,12 @@ public StringValues HeaderContentEncoding { get { - if (((_bits & 4096L) != 0)) + StringValues value; + if ((_bits & 4096L) != 0) { - return _headers._ContentEncoding; + value = _headers._ContentEncoding; } - return StringValues.Empty; + return value; } set { @@ -228,11 +241,12 @@ public StringValues HeaderContentLanguage { get { - if (((_bits & 8192L) != 0)) + StringValues value; + if ((_bits & 8192L) != 0) { - return _headers._ContentLanguage; + value = _headers._ContentLanguage; } - return StringValues.Empty; + return value; } set { @@ -244,11 +258,12 @@ public StringValues HeaderContentLocation { get { - if (((_bits & 16384L) != 0)) + StringValues value; + if ((_bits & 16384L) != 0) { - return _headers._ContentLocation; + value = _headers._ContentLocation; } - return StringValues.Empty; + return value; } set { @@ -260,11 +275,12 @@ public StringValues HeaderContentMD5 { get { - if (((_bits & 32768L) != 0)) + StringValues value; + if ((_bits & 32768L) != 0) { - return _headers._ContentMD5; + value = _headers._ContentMD5; } - return StringValues.Empty; + return value; } set { @@ -276,11 +292,12 @@ public StringValues HeaderContentRange { get { - if (((_bits & 65536L) != 0)) + StringValues value; + if ((_bits & 65536L) != 0) { - return _headers._ContentRange; + value = _headers._ContentRange; } - return StringValues.Empty; + return value; } set { @@ -292,11 +309,12 @@ public StringValues HeaderExpires { get { - if (((_bits & 131072L) != 0)) + StringValues value; + if ((_bits & 131072L) != 0) { - return _headers._Expires; + value = _headers._Expires; } - return StringValues.Empty; + return value; } set { @@ -308,11 +326,12 @@ public StringValues HeaderLastModified { get { - if (((_bits & 262144L) != 0)) + StringValues value; + if ((_bits & 262144L) != 0) { - return _headers._LastModified; + value = _headers._LastModified; } - return StringValues.Empty; + return value; } set { @@ -324,11 +343,12 @@ public StringValues HeaderAccept { get { - if (((_bits & 524288L) != 0)) + StringValues value; + if ((_bits & 524288L) != 0) { - return _headers._Accept; + value = _headers._Accept; } - return StringValues.Empty; + return value; } set { @@ -340,11 +360,12 @@ public StringValues HeaderAcceptCharset { get { - if (((_bits & 1048576L) != 0)) + StringValues value; + if ((_bits & 1048576L) != 0) { - return _headers._AcceptCharset; + value = _headers._AcceptCharset; } - return StringValues.Empty; + return value; } set { @@ -356,11 +377,12 @@ public StringValues HeaderAcceptEncoding { get { - if (((_bits & 2097152L) != 0)) + StringValues value; + if ((_bits & 2097152L) != 0) { - return _headers._AcceptEncoding; + value = _headers._AcceptEncoding; } - return StringValues.Empty; + return value; } set { @@ -372,11 +394,12 @@ public StringValues HeaderAcceptLanguage { get { - if (((_bits & 4194304L) != 0)) + StringValues value; + if ((_bits & 4194304L) != 0) { - return _headers._AcceptLanguage; + value = _headers._AcceptLanguage; } - return StringValues.Empty; + return value; } set { @@ -388,11 +411,12 @@ public StringValues HeaderAuthorization { get { - if (((_bits & 8388608L) != 0)) + StringValues value; + if ((_bits & 8388608L) != 0) { - return _headers._Authorization; + value = _headers._Authorization; } - return StringValues.Empty; + return value; } set { @@ -404,11 +428,12 @@ public StringValues HeaderCookie { get { - if (((_bits & 16777216L) != 0)) + StringValues value; + if ((_bits & 16777216L) != 0) { - return _headers._Cookie; + value = _headers._Cookie; } - return StringValues.Empty; + return value; } set { @@ -420,11 +445,12 @@ public StringValues HeaderExpect { get { - if (((_bits & 33554432L) != 0)) + StringValues value; + if ((_bits & 33554432L) != 0) { - return _headers._Expect; + value = _headers._Expect; } - return StringValues.Empty; + return value; } set { @@ -436,11 +462,12 @@ public StringValues HeaderFrom { get { - if (((_bits & 67108864L) != 0)) + StringValues value; + if ((_bits & 67108864L) != 0) { - return _headers._From; + value = _headers._From; } - return StringValues.Empty; + return value; } set { @@ -452,11 +479,12 @@ public StringValues HeaderHost { get { - if (((_bits & 134217728L) != 0)) + StringValues value; + if ((_bits & 134217728L) != 0) { - return _headers._Host; + value = _headers._Host; } - return StringValues.Empty; + return value; } set { @@ -468,11 +496,12 @@ public StringValues HeaderIfMatch { get { - if (((_bits & 268435456L) != 0)) + StringValues value; + if ((_bits & 268435456L) != 0) { - return _headers._IfMatch; + value = _headers._IfMatch; } - return StringValues.Empty; + return value; } set { @@ -484,11 +513,12 @@ public StringValues HeaderIfModifiedSince { get { - if (((_bits & 536870912L) != 0)) + StringValues value; + if ((_bits & 536870912L) != 0) { - return _headers._IfModifiedSince; + value = _headers._IfModifiedSince; } - return StringValues.Empty; + return value; } set { @@ -500,11 +530,12 @@ public StringValues HeaderIfNoneMatch { get { - if (((_bits & 1073741824L) != 0)) + StringValues value; + if ((_bits & 1073741824L) != 0) { - return _headers._IfNoneMatch; + value = _headers._IfNoneMatch; } - return StringValues.Empty; + return value; } set { @@ -516,11 +547,12 @@ public StringValues HeaderIfRange { get { - if (((_bits & 2147483648L) != 0)) + StringValues value; + if ((_bits & 2147483648L) != 0) { - return _headers._IfRange; + value = _headers._IfRange; } - return StringValues.Empty; + return value; } set { @@ -532,11 +564,12 @@ public StringValues HeaderIfUnmodifiedSince { get { - if (((_bits & 4294967296L) != 0)) + StringValues value; + if ((_bits & 4294967296L) != 0) { - return _headers._IfUnmodifiedSince; + value = _headers._IfUnmodifiedSince; } - return StringValues.Empty; + return value; } set { @@ -548,11 +581,12 @@ public StringValues HeaderMaxForwards { get { - if (((_bits & 8589934592L) != 0)) + StringValues value; + if ((_bits & 8589934592L) != 0) { - return _headers._MaxForwards; + value = _headers._MaxForwards; } - return StringValues.Empty; + return value; } set { @@ -564,11 +598,12 @@ public StringValues HeaderProxyAuthorization { get { - if (((_bits & 17179869184L) != 0)) + StringValues value; + if ((_bits & 17179869184L) != 0) { - return _headers._ProxyAuthorization; + value = _headers._ProxyAuthorization; } - return StringValues.Empty; + return value; } set { @@ -580,11 +615,12 @@ public StringValues HeaderReferer { get { - if (((_bits & 34359738368L) != 0)) + StringValues value; + if ((_bits & 34359738368L) != 0) { - return _headers._Referer; + value = _headers._Referer; } - return StringValues.Empty; + return value; } set { @@ -596,11 +632,12 @@ public StringValues HeaderRange { get { - if (((_bits & 68719476736L) != 0)) + StringValues value; + if ((_bits & 68719476736L) != 0) { - return _headers._Range; + value = _headers._Range; } - return StringValues.Empty; + return value; } set { @@ -612,11 +649,12 @@ public StringValues HeaderTE { get { - if (((_bits & 137438953472L) != 0)) + StringValues value; + if ((_bits & 137438953472L) != 0) { - return _headers._TE; + value = _headers._TE; } - return StringValues.Empty; + return value; } set { @@ -628,11 +666,12 @@ public StringValues HeaderTranslate { get { - if (((_bits & 274877906944L) != 0)) + StringValues value; + if ((_bits & 274877906944L) != 0) { - return _headers._Translate; + value = _headers._Translate; } - return StringValues.Empty; + return value; } set { @@ -644,11 +683,12 @@ public StringValues HeaderUserAgent { get { - if (((_bits & 549755813888L) != 0)) + StringValues value; + if ((_bits & 549755813888L) != 0) { - return _headers._UserAgent; + value = _headers._UserAgent; } - return StringValues.Empty; + return value; } set { @@ -660,11 +700,12 @@ public StringValues HeaderOrigin { get { - if (((_bits & 1099511627776L) != 0)) + StringValues value; + if ((_bits & 1099511627776L) != 0) { - return _headers._Origin; + value = _headers._Origin; } - return StringValues.Empty; + return value; } set { @@ -676,11 +717,12 @@ public StringValues HeaderAccessControlRequestMethod { get { - if (((_bits & 2199023255552L) != 0)) + StringValues value; + if ((_bits & 2199023255552L) != 0) { - return _headers._AccessControlRequestMethod; + value = _headers._AccessControlRequestMethod; } - return StringValues.Empty; + return value; } set { @@ -692,11 +734,12 @@ public StringValues HeaderAccessControlRequestHeaders { get { - if (((_bits & 4398046511104L) != 0)) + StringValues value; + if ((_bits & 4398046511104L) != 0) { - return _headers._AccessControlRequestHeaders; + value = _headers._AccessControlRequestHeaders; } - return StringValues.Empty; + return value; } set { @@ -708,23 +751,25 @@ public StringValues HeaderContentLength { get { + StringValues value; if (ContentLength.HasValue) { - return HeaderUtilities.FormatInt64(ContentLength.Value); + value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); } - return StringValues.Empty; + return value; } set { ContentLength = ParseRequestContentLength(value); } } - + protected override int GetCountFast() { return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } - protected override StringValues GetValueFast(string key) + + protected override bool TryGetValueFast(string key, out StringValues value) { switch (key.Length) { @@ -732,62 +777,48 @@ protected override StringValues GetValueFast(string key) { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { - return _headers._CacheControl; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._CacheControl; + return true; } + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) - { - return _headers._ContentRange; - } - else + if ((_bits & 65536L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ContentRange; + return true; } + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) - { - return _headers._LastModified; - } - else + if ((_bits & 262144L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._LastModified; + return true; } + return false; } - if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) - { - return _headers._Authorization; - } - else + if ((_bits & 8388608L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Authorization; + return true; } + return false; } - if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { - return _headers._IfNoneMatch; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._IfNoneMatch; + return true; } + return false; } } break; @@ -795,38 +826,30 @@ protected override StringValues GetValueFast(string key) { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { - return _headers._Connection; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Connection; + return true; } + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) - { - return _headers._KeepAlive; - } - else + if ((_bits & 8L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._KeepAlive; + return true; } + return false; } - if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) - { - return _headers._UserAgent; - } - else + if ((_bits & 549755813888L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._UserAgent; + return true; } + return false; } } break; @@ -834,38 +857,30 @@ protected override StringValues GetValueFast(string key) { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) - { - return _headers._Date; - } - else + if ((_bits & 4L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Date; + return true; } + return false; } - if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) - { - return _headers._From; - } - else + if ((_bits & 67108864L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._From; + return true; } + return false; } - if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { - return _headers._Host; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Host; + return true; } + return false; } } break; @@ -873,62 +888,48 @@ protected override StringValues GetValueFast(string key) { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { - return _headers._Pragma; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Pragma; + return true; } + return false; } - if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) - { - return _headers._Accept; - } - else + if ((_bits & 524288L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Accept; + return true; } + return false; } - if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) - { - return _headers._Cookie; - } - else + if ((_bits & 16777216L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Cookie; + return true; } + return false; } - if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) - { - return _headers._Expect; - } - else + if ((_bits & 33554432L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Expect; + return true; } + return false; } - if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { - return _headers._Origin; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Origin; + return true; } + return false; } } break; @@ -936,62 +937,48 @@ protected override StringValues GetValueFast(string key) { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { - return _headers._Trailer; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Trailer; + return true; } + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) - { - return _headers._Upgrade; - } - else + if ((_bits & 128L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Upgrade; + return true; } + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) - { - return _headers._Warning; - } - else + if ((_bits & 512L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Warning; + return true; } + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) - { - return _headers._Expires; - } - else + if ((_bits & 131072L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Expires; + return true; } + return false; } - if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { - return _headers._Referer; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._Referer; + return true; } + return false; } } break; @@ -999,26 +986,21 @@ protected override StringValues GetValueFast(string key) { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { - return _headers._TransferEncoding; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._TransferEncoding; + return true; } + return false; } - if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) - { - return _headers._IfModifiedSince; - } - else + if ((_bits & 536870912L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._IfModifiedSince; + return true; } + return false; } } break; @@ -1026,14 +1008,12 @@ protected override StringValues GetValueFast(string key) { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) - { - return _headers._Via; - } - else + if ((_bits & 256L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Via; + return true; } + return false; } } break; @@ -1041,26 +1021,21 @@ protected override StringValues GetValueFast(string key) { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) - { - return _headers._Allow; - } - else + if ((_bits & 1024L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Allow; + return true; } + return false; } - if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) - { - return _headers._Range; - } - else + if ((_bits & 68719476736L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Range; + return true; } + return false; } } break; @@ -1068,26 +1043,21 @@ protected override StringValues GetValueFast(string key) { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentType; - } - else + if ((_bits & 2048L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ContentType; + return true; } + return false; } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) - { - return _headers._MaxForwards; - } - else + if ((_bits & 8589934592L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._MaxForwards; + return true; } + return false; } } break; @@ -1095,38 +1065,30 @@ protected override StringValues GetValueFast(string key) { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) - { - return _headers._ContentEncoding; - } - else + if ((_bits & 4096L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ContentEncoding; + return true; } + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { - return _headers._ContentLanguage; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._ContentLanguage; + return true; } + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) - { - return _headers._ContentLocation; - } - else + if ((_bits & 16384L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ContentLocation; + return true; } + return false; } } break; @@ -1134,14 +1096,12 @@ protected override StringValues GetValueFast(string key) { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) - { - return _headers._ContentMD5; - } - else + if ((_bits & 32768L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ContentMD5; + return true; } + return false; } } break; @@ -1149,26 +1109,21 @@ protected override StringValues GetValueFast(string key) { if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) - { - return _headers._AcceptCharset; - } - else + if ((_bits & 1048576L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._AcceptCharset; + return true; } + return false; } - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (ContentLength.HasValue) { - return HeaderUtilities.FormatInt64(ContentLength.Value); - } - else - { - ThrowKeyNotFoundException(); + value = HeaderUtilities.FormatInt64(ContentLength.Value); + return true; } + return false; } } break; @@ -1176,26 +1131,21 @@ protected override StringValues GetValueFast(string key) { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) - { - return _headers._AcceptEncoding; - } - else + if ((_bits & 2097152L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._AcceptEncoding; + return true; } + return false; } - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) - { - return _headers._AcceptLanguage; - } - else + if ((_bits & 4194304L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._AcceptLanguage; + return true; } + return false; } } break; @@ -1203,26 +1153,21 @@ protected override StringValues GetValueFast(string key) { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) - { - return _headers._IfMatch; - } - else + if ((_bits & 268435456L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._IfMatch; + return true; } + return false; } - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { - return _headers._IfRange; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._IfRange; + return true; } + return false; } } break; @@ -1230,26 +1175,21 @@ protected override StringValues GetValueFast(string key) { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { - return _headers._IfUnmodifiedSince; - } - else - { - ThrowKeyNotFoundException(); + value = _headers._IfUnmodifiedSince; + return true; } + return false; } - if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) - { - return _headers._ProxyAuthorization; - } - else + if ((_bits & 17179869184L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._ProxyAuthorization; + return true; } + return false; } } break; @@ -1257,14 +1197,12 @@ protected override StringValues GetValueFast(string key) { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) - { - return _headers._TE; - } - else + if ((_bits & 137438953472L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._TE; + return true; } + return false; } } break; @@ -1272,14 +1210,12 @@ protected override StringValues GetValueFast(string key) { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) - { - return _headers._Translate; - } - else + if ((_bits & 274877906944L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._Translate; + return true; } + return false; } } break; @@ -1287,14 +1223,12 @@ protected override StringValues GetValueFast(string key) { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) - { - return _headers._AccessControlRequestMethod; - } - else + if ((_bits & 2199023255552L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._AccessControlRequestMethod; + return true; } + return false; } } break; @@ -1302,25 +1236,21 @@ protected override StringValues GetValueFast(string key) { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) - { - return _headers._AccessControlRequestHeaders; - } - else + if ((_bits & 4398046511104L) != 0) { - ThrowKeyNotFoundException(); + value = _headers._AccessControlRequestHeaders; + return true; } + return false; } } break; } - if (MaybeUnknown == null) - { - ThrowKeyNotFoundException(); - } - return MaybeUnknown[key]; + + return MaybeUnknown?.TryGetValue(key, out value) ?? false; } - protected override bool TryGetValueFast(string key, out StringValues value) + + protected override void SetValueFast(string key, StringValues value) { switch (key.Length) { @@ -1328,2487 +1258,1528 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) - { - value = _headers._CacheControl; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 1L; + _headers._CacheControl = value; + return; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) - { - value = _headers._ContentRange; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 65536L; + _headers._ContentRange = value; + return; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) - { - value = _headers._LastModified; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 262144L; + _headers._LastModified = value; + return; } - if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) - { - value = _headers._Authorization; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 8388608L; + _headers._Authorization = value; + return; } - if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) - { - value = _headers._IfNoneMatch; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 1073741824L; + _headers._IfNoneMatch = value; + return; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) - { - value = _headers._Connection; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 2L; + _headers._Connection = value; + return; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) - { - value = _headers._KeepAlive; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 8L; + _headers._KeepAlive = value; + return; } - if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) - { - value = _headers._UserAgent; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 549755813888L; + _headers._UserAgent = value; + return; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) - { - value = _headers._Date; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 4L; + _headers._Date = value; + return; } - if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) - { - value = _headers._From; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 67108864L; + _headers._From = value; + return; } - if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) - { - value = _headers._Host; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 134217728L; + _headers._Host = value; + return; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) - { - value = _headers._Pragma; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 16L; + _headers._Pragma = value; + return; } - if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) - { - value = _headers._Accept; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 524288L; + _headers._Accept = value; + return; } - if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) - { - value = _headers._Cookie; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 16777216L; + _headers._Cookie = value; + return; } - if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) - { - value = _headers._Expect; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 33554432L; + _headers._Expect = value; + return; } - if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) - { - value = _headers._Origin; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 1099511627776L; + _headers._Origin = value; + return; } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) - { - value = _headers._Trailer; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 32L; + _headers._Trailer = value; + return; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) - { - value = _headers._Upgrade; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 128L; + _headers._Upgrade = value; + return; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) - { - value = _headers._Warning; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 512L; + _headers._Warning = value; + return; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) - { - value = _headers._Expires; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 131072L; + _headers._Expires = value; + return; } - if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) - { - value = _headers._Referer; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 34359738368L; + _headers._Referer = value; + return; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) - { - value = _headers._TransferEncoding; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 64L; + _headers._TransferEncoding = value; + return; } - if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) - { - value = _headers._IfModifiedSince; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 536870912L; + _headers._IfModifiedSince = value; + return; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) - { - value = _headers._Via; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 256L; + _headers._Via = value; + return; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) - { - value = _headers._Allow; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 1024L; + _headers._Allow = value; + return; } - if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) - { - value = _headers._Range; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 68719476736L; + _headers._Range = value; + return; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) - { - value = _headers._ContentType; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 2048L; + _headers._ContentType = value; + return; } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) - { - value = _headers._MaxForwards; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 8589934592L; + _headers._MaxForwards = value; + return; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) - { - value = _headers._ContentEncoding; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 4096L; + _headers._ContentEncoding = value; + return; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) - { - value = _headers._ContentLanguage; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 8192L; + _headers._ContentLanguage = value; + return; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) - { - value = _headers._ContentLocation; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 16384L; + _headers._ContentLocation = value; + return; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) - { - value = _headers._ContentMD5; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 32768L; + _headers._ContentMD5 = value; + return; } } break; - case 14: { if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) - { - value = _headers._AcceptCharset; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 1048576L; + _headers._AcceptCharset = value; + return; } - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) - { - value = HeaderUtilities.FormatInt64(ContentLength.Value); - return true; - } - else - { - value = StringValues.Empty; - return false; - } + ContentLength = ParseRequestContentLength(value); + return; } } break; - case 15: { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) - { - value = _headers._AcceptEncoding; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 2097152L; + _headers._AcceptEncoding = value; + return; } - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) - { - value = _headers._AcceptLanguage; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 4194304L; + _headers._AcceptLanguage = value; + return; } } break; - case 8: { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) - { - value = _headers._IfMatch; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 268435456L; + _headers._IfMatch = value; + return; } - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) - { - value = _headers._IfRange; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 2147483648L; + _headers._IfRange = value; + return; } } break; - case 19: { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) - { - value = _headers._IfUnmodifiedSince; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 4294967296L; + _headers._IfUnmodifiedSince = value; + return; } - if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) - { - value = _headers._ProxyAuthorization; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 17179869184L; + _headers._ProxyAuthorization = value; + return; } } break; - case 2: { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) - { - value = _headers._TE; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 137438953472L; + _headers._TE = value; + return; } } break; - case 9: { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) - { - value = _headers._Translate; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 274877906944L; + _headers._Translate = value; + return; } } break; - case 29: { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) - { - value = _headers._AccessControlRequestMethod; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 2199023255552L; + _headers._AccessControlRequestMethod = value; + return; } } break; - case 30: { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) - { - value = _headers._AccessControlRequestHeaders; - return true; - } - else - { - value = StringValues.Empty; - return false; - } + _bits |= 4398046511104L; + _headers._AccessControlRequestHeaders = value; + return; } } break; -} - value = StringValues.Empty; - return MaybeUnknown?.TryGetValue(key, out value) ?? false; + } + + Unknown[key] = value; } - protected override void SetValueFast(string key, StringValues value) + + protected override bool AddValueFast(string key, StringValues value) { - switch (key.Length) { case 13: { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1L; - _headers._CacheControl = value; - return; + if ((_bits & 1L) == 0) + { + _bits |= 1L; + _headers._CacheControl = value; + return true; + } + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 65536L; - _headers._ContentRange = value; - return; + if ((_bits & 65536L) == 0) + { + _bits |= 65536L; + _headers._ContentRange = value; + return true; + } + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 262144L; - _headers._LastModified = value; - return; + if ((_bits & 262144L) == 0) + { + _bits |= 262144L; + _headers._LastModified = value; + return true; + } + return false; } - if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8388608L; - _headers._Authorization = value; - return; + if ((_bits & 8388608L) == 0) + { + _bits |= 8388608L; + _headers._Authorization = value; + return true; + } + return false; } - if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1073741824L; - _headers._IfNoneMatch = value; - return; + if ((_bits & 1073741824L) == 0) + { + _bits |= 1073741824L; + _headers._IfNoneMatch = value; + return true; + } + return false; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2L; - _headers._Connection = value; - return; + if ((_bits & 2L) == 0) + { + _bits |= 2L; + _headers._Connection = value; + return true; + } + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8L; - _headers._KeepAlive = value; - return; + if ((_bits & 8L) == 0) + { + _bits |= 8L; + _headers._KeepAlive = value; + return true; + } + return false; } - if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 549755813888L; - _headers._UserAgent = value; - return; + if ((_bits & 549755813888L) == 0) + { + _bits |= 549755813888L; + _headers._UserAgent = value; + return true; + } + return false; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4L; - _headers._Date = value; - return; + if ((_bits & 4L) == 0) + { + _bits |= 4L; + _headers._Date = value; + return true; + } + return false; } - if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 67108864L; - _headers._From = value; - return; + if ((_bits & 67108864L) == 0) + { + _bits |= 67108864L; + _headers._From = value; + return true; + } + return false; } - if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 134217728L; - _headers._Host = value; - return; + if ((_bits & 134217728L) == 0) + { + _bits |= 134217728L; + _headers._Host = value; + return true; + } + return false; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16L; - _headers._Pragma = value; - return; + if ((_bits & 16L) == 0) + { + _bits |= 16L; + _headers._Pragma = value; + return true; + } + return false; } - if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 524288L; - _headers._Accept = value; - return; + if ((_bits & 524288L) == 0) + { + _bits |= 524288L; + _headers._Accept = value; + return true; + } + return false; } - if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16777216L; - _headers._Cookie = value; - return; + if ((_bits & 16777216L) == 0) + { + _bits |= 16777216L; + _headers._Cookie = value; + return true; + } + return false; } - if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 33554432L; - _headers._Expect = value; - return; + if ((_bits & 33554432L) == 0) + { + _bits |= 33554432L; + _headers._Expect = value; + return true; + } + return false; } - if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1099511627776L; - _headers._Origin = value; - return; - } - } + if ((_bits & 1099511627776L) == 0) + { + _bits |= 1099511627776L; + _headers._Origin = value; + return true; + } + return false; + } + } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 32L; - _headers._Trailer = value; - return; + if ((_bits & 32L) == 0) + { + _bits |= 32L; + _headers._Trailer = value; + return true; + } + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 128L; - _headers._Upgrade = value; - return; + if ((_bits & 128L) == 0) + { + _bits |= 128L; + _headers._Upgrade = value; + return true; + } + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 512L; - _headers._Warning = value; - return; + if ((_bits & 512L) == 0) + { + _bits |= 512L; + _headers._Warning = value; + return true; + } + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 131072L; - _headers._Expires = value; - return; + if ((_bits & 131072L) == 0) + { + _bits |= 131072L; + _headers._Expires = value; + return true; + } + return false; } - if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 34359738368L; - _headers._Referer = value; - return; + if ((_bits & 34359738368L) == 0) + { + _bits |= 34359738368L; + _headers._Referer = value; + return true; + } + return false; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 64L; - _headers._TransferEncoding = value; - return; + if ((_bits & 64L) == 0) + { + _bits |= 64L; + _headers._TransferEncoding = value; + return true; + } + return false; } - if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 536870912L; - _headers._IfModifiedSince = value; - return; + if ((_bits & 536870912L) == 0) + { + _bits |= 536870912L; + _headers._IfModifiedSince = value; + return true; + } + return false; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 256L; - _headers._Via = value; - return; + if ((_bits & 256L) == 0) + { + _bits |= 256L; + _headers._Via = value; + return true; + } + return false; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1024L; - _headers._Allow = value; - return; + if ((_bits & 1024L) == 0) + { + _bits |= 1024L; + _headers._Allow = value; + return true; + } + return false; } - if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 68719476736L; - _headers._Range = value; - return; + if ((_bits & 68719476736L) == 0) + { + _bits |= 68719476736L; + _headers._Range = value; + return true; + } + return false; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2048L; - _headers._ContentType = value; - return; + if ((_bits & 2048L) == 0) + { + _bits |= 2048L; + _headers._ContentType = value; + return true; + } + return false; } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8589934592L; - _headers._MaxForwards = value; - return; + if ((_bits & 8589934592L) == 0) + { + _bits |= 8589934592L; + _headers._MaxForwards = value; + return true; + } + return false; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4096L; - _headers._ContentEncoding = value; - return; + if ((_bits & 4096L) == 0) + { + _bits |= 4096L; + _headers._ContentEncoding = value; + return true; + } + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 8192L; - _headers._ContentLanguage = value; - return; + if ((_bits & 8192L) == 0) + { + _bits |= 8192L; + _headers._ContentLanguage = value; + return true; + } + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 16384L; - _headers._ContentLocation = value; - return; + if ((_bits & 16384L) == 0) + { + _bits |= 16384L; + _headers._ContentLocation = value; + return true; + } + return false; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 32768L; - _headers._ContentMD5 = value; - return; + if ((_bits & 32768L) == 0) + { + _bits |= 32768L; + _headers._ContentMD5 = value; + return true; + } + return false; } } break; - case 14: { if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 1048576L; - _headers._AcceptCharset = value; - return; + if ((_bits & 1048576L) == 0) + { + _bits |= 1048576L; + _headers._AcceptCharset = value; + return true; + } + return false; } - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - ContentLength = ParseRequestContentLength(value); - return; + if (!ContentLength.HasValue) + { + ContentLength = ParseRequestContentLength(value); + return true; + } + return false; } } break; - case 15: { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2097152L; - _headers._AcceptEncoding = value; - return; + if ((_bits & 2097152L) == 0) + { + _bits |= 2097152L; + _headers._AcceptEncoding = value; + return true; + } + return false; } - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4194304L; - _headers._AcceptLanguage = value; - return; + if ((_bits & 4194304L) == 0) + { + _bits |= 4194304L; + _headers._AcceptLanguage = value; + return true; + } + return false; } } break; - case 8: { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 268435456L; - _headers._IfMatch = value; - return; + if ((_bits & 268435456L) == 0) + { + _bits |= 268435456L; + _headers._IfMatch = value; + return true; + } + return false; } - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2147483648L; - _headers._IfRange = value; - return; + if ((_bits & 2147483648L) == 0) + { + _bits |= 2147483648L; + _headers._IfRange = value; + return true; + } + return false; } } break; - case 19: { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4294967296L; - _headers._IfUnmodifiedSince = value; - return; + if ((_bits & 4294967296L) == 0) + { + _bits |= 4294967296L; + _headers._IfUnmodifiedSince = value; + return true; + } + return false; } - if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 17179869184L; - _headers._ProxyAuthorization = value; - return; + if ((_bits & 17179869184L) == 0) + { + _bits |= 17179869184L; + _headers._ProxyAuthorization = value; + return true; + } + return false; } } break; - case 2: { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 137438953472L; - _headers._TE = value; - return; + if ((_bits & 137438953472L) == 0) + { + _bits |= 137438953472L; + _headers._TE = value; + return true; + } + return false; } } break; - case 9: { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 274877906944L; - _headers._Translate = value; - return; + if ((_bits & 274877906944L) == 0) + { + _bits |= 274877906944L; + _headers._Translate = value; + return true; + } + return false; } } break; - case 29: { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 2199023255552L; - _headers._AccessControlRequestMethod = value; - return; + if ((_bits & 2199023255552L) == 0) + { + _bits |= 2199023255552L; + _headers._AccessControlRequestMethod = value; + return true; + } + return false; } } break; - case 30: { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - _bits |= 4398046511104L; - _headers._AccessControlRequestHeaders = value; - return; + if ((_bits & 4398046511104L) == 0) + { + _bits |= 4398046511104L; + _headers._AccessControlRequestHeaders = value; + return true; + } + return false; } } break; -} - - Unknown[key] = value; + } + + Unknown.Add(key, value); + // Return true, above will throw and exit for false + return true; } - protected override void AddValueFast(string key, StringValues value) + + protected override bool RemoveFast(string key) { - switch (key.Length) { case 13: { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~1L; + _headers._CacheControl = default(StringValues); + return true; } - _bits |= 1L; - _headers._CacheControl = value; - return; + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~65536L; + _headers._ContentRange = default(StringValues); + return true; } - _bits |= 65536L; - _headers._ContentRange = value; - return; + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~262144L; + _headers._LastModified = default(StringValues); + return true; } - _bits |= 262144L; - _headers._LastModified = value; - return; + return false; } - if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~8388608L; + _headers._Authorization = default(StringValues); + return true; } - _bits |= 8388608L; - _headers._Authorization = value; - return; + return false; } - if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~1073741824L; + _headers._IfNoneMatch = default(StringValues); + return true; } - _bits |= 1073741824L; - _headers._IfNoneMatch = value; - return; + return false; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~2L; + _headers._Connection = default(StringValues); + return true; } - _bits |= 2L; - _headers._Connection = value; - return; + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~8L; + _headers._KeepAlive = default(StringValues); + return true; } - _bits |= 8L; - _headers._KeepAlive = value; - return; + return false; } - if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 549755813888L) != 0)) + if ((_bits & 549755813888L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~549755813888L; + _headers._UserAgent = default(StringValues); + return true; } - _bits |= 549755813888L; - _headers._UserAgent = value; - return; + return false; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~4L; + _headers._Date = default(StringValues); + return true; } - _bits |= 4L; - _headers._Date = value; - return; + return false; } - if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~67108864L; + _headers._From = default(StringValues); + return true; } - _bits |= 67108864L; - _headers._From = value; - return; + return false; } - if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~134217728L; + _headers._Host = default(StringValues); + return true; } - _bits |= 134217728L; - _headers._Host = value; - return; + return false; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~16L; + _headers._Pragma = default(StringValues); + return true; } - _bits |= 16L; - _headers._Pragma = value; - return; + return false; } - if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~524288L; + _headers._Accept = default(StringValues); + return true; } - _bits |= 524288L; - _headers._Accept = value; - return; + return false; } - if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~16777216L; + _headers._Cookie = default(StringValues); + return true; } - _bits |= 16777216L; - _headers._Cookie = value; - return; + return false; } - if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~33554432L; + _headers._Expect = default(StringValues); + return true; } - _bits |= 33554432L; - _headers._Expect = value; - return; + return false; } - if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~1099511627776L; + _headers._Origin = default(StringValues); + return true; } - _bits |= 1099511627776L; - _headers._Origin = value; - return; + return false; } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~32L; + _headers._Trailer = default(StringValues); + return true; } - _bits |= 32L; - _headers._Trailer = value; - return; + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~128L; + _headers._Upgrade = default(StringValues); + return true; } - _bits |= 128L; - _headers._Upgrade = value; - return; + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~512L; + _headers._Warning = default(StringValues); + return true; } - _bits |= 512L; - _headers._Warning = value; - return; + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~131072L; + _headers._Expires = default(StringValues); + return true; } - _bits |= 131072L; - _headers._Expires = value; - return; + return false; } - if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~34359738368L; + _headers._Referer = default(StringValues); + return true; } - _bits |= 34359738368L; - _headers._Referer = value; - return; + return false; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~64L; + _headers._TransferEncoding = default(StringValues); + return true; } - _bits |= 64L; - _headers._TransferEncoding = value; - return; + return false; } - if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~536870912L; + _headers._IfModifiedSince = default(StringValues); + return true; } - _bits |= 536870912L; - _headers._IfModifiedSince = value; - return; + return false; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~256L; + _headers._Via = default(StringValues); + return true; } - _bits |= 256L; - _headers._Via = value; - return; + return false; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~1024L; + _headers._Allow = default(StringValues); + return true; } - _bits |= 1024L; - _headers._Allow = value; - return; + return false; } - if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 68719476736L) != 0)) + if ((_bits & 68719476736L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~68719476736L; + _headers._Range = default(StringValues); + return true; } - _bits |= 68719476736L; - _headers._Range = value; - return; + return false; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~2048L; + _headers._ContentType = default(StringValues); + return true; } - _bits |= 2048L; - _headers._ContentType = value; - return; + return false; } - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~8589934592L; + _headers._MaxForwards = default(StringValues); + return true; } - _bits |= 8589934592L; - _headers._MaxForwards = value; - return; + return false; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~4096L; + _headers._ContentEncoding = default(StringValues); + return true; } - _bits |= 4096L; - _headers._ContentEncoding = value; - return; + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~8192L; + _headers._ContentLanguage = default(StringValues); + return true; } - _bits |= 8192L; - _headers._ContentLanguage = value; - return; + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~16384L; + _headers._ContentLocation = default(StringValues); + return true; } - _bits |= 16384L; - _headers._ContentLocation = value; - return; + return false; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~32768L; + _headers._ContentMD5 = default(StringValues); + return true; } - _bits |= 32768L; - _headers._ContentMD5 = value; - return; + return false; } } break; - case 14: { if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~1048576L; + _headers._AcceptCharset = default(StringValues); + return true; } - _bits |= 1048576L; - _headers._AcceptCharset = value; - return; + return false; } - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { if (ContentLength.HasValue) { - ThrowDuplicateKeyException(); - } - else - { - ContentLength = ParseRequestContentLength(value); + ContentLength = null; + return true; } - return; + return false; } } break; - case 15: { if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~2097152L; + _headers._AcceptEncoding = default(StringValues); + return true; } - _bits |= 2097152L; - _headers._AcceptEncoding = value; - return; + return false; } - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~4194304L; + _headers._AcceptLanguage = default(StringValues); + return true; } - _bits |= 4194304L; - _headers._AcceptLanguage = value; - return; + return false; } } break; - case 8: { if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~268435456L; + _headers._IfMatch = default(StringValues); + return true; } - _bits |= 268435456L; - _headers._IfMatch = value; - return; + return false; } - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~2147483648L; + _headers._IfRange = default(StringValues); + return true; } - _bits |= 2147483648L; - _headers._IfRange = value; - return; + return false; } } break; - case 19: { if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~4294967296L; + _headers._IfUnmodifiedSince = default(StringValues); + return true; } - _bits |= 4294967296L; - _headers._IfUnmodifiedSince = value; - return; + return false; } - if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~17179869184L; + _headers._ProxyAuthorization = default(StringValues); + return true; } - _bits |= 17179869184L; - _headers._ProxyAuthorization = value; - return; + return false; } } break; - case 2: { if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 137438953472L) != 0)) + if ((_bits & 137438953472L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~137438953472L; + _headers._TE = default(StringValues); + return true; } - _bits |= 137438953472L; - _headers._TE = value; - return; + return false; } } break; - case 9: { if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 274877906944L) != 0)) + if ((_bits & 274877906944L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~274877906944L; + _headers._Translate = default(StringValues); + return true; } - _bits |= 274877906944L; - _headers._Translate = value; - return; + return false; } } break; - case 29: { if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2199023255552L) != 0)) + if ((_bits & 2199023255552L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~2199023255552L; + _headers._AccessControlRequestMethod = default(StringValues); + return true; } - _bits |= 2199023255552L; - _headers._AccessControlRequestMethod = value; - return; + return false; } } break; - case 30: { if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4398046511104L) != 0)) + if ((_bits & 4398046511104L) != 0) { - ThrowDuplicateKeyException(); + _bits &= ~4398046511104L; + _headers._AccessControlRequestHeaders = default(StringValues); + return true; } - _bits |= 4398046511104L; - _headers._AccessControlRequestHeaders = value; - return; + return false; } } break; } - - Unknown.Add(key, value); + + return MaybeUnknown?.Remove(key) ?? false; } - protected override bool RemoveFast(string key) + + protected override void ClearFast() { - switch (key.Length) + MaybeUnknown?.Clear(); + ContentLength = null; + if(FrameHeaders.BitCount(_bits) > 12) { - case 13: - { - if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1L) != 0)) - { - _bits &= ~1L; - _headers._CacheControl = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 65536L) != 0)) - { - _bits &= ~65536L; - _headers._ContentRange = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 262144L) != 0)) - { - _bits &= ~262144L; - _headers._LastModified = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8388608L) != 0)) - { - _bits &= ~8388608L; - _headers._Authorization = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("If-None-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1073741824L) != 0)) - { - _bits &= ~1073741824L; - _headers._IfNoneMatch = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - - case 10: - { - if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2L) != 0)) - { - _bits &= ~2L; - _headers._Connection = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8L) != 0)) - { - _bits &= ~8L; - _headers._KeepAlive = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("User-Agent".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 549755813888L) != 0)) - { - _bits &= ~549755813888L; - _headers._UserAgent = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + _headers = default(HeaderReferences); + _bits = 0; + return; + } - case 4: - { - if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4L) != 0)) - { - _bits &= ~4L; - _headers._Date = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("From".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 67108864L) != 0)) - { - _bits &= ~67108864L; - _headers._From = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Host".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 134217728L) != 0)) - { - _bits &= ~134217728L; - _headers._Host = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 524288L) != 0) + { + _headers._Accept = default(StringValues); + _bits &= ~524288L; + if(_bits == 0) + { + return; + } + } - case 6: - { - if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16L) != 0)) - { - _bits &= ~16L; - _headers._Pragma = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Accept".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 524288L) != 0)) - { - _bits &= ~524288L; - _headers._Accept = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16777216L) != 0)) - { - _bits &= ~16777216L; - _headers._Cookie = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Expect".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 33554432L) != 0)) - { - _bits &= ~33554432L; - _headers._Expect = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1099511627776L) != 0)) - { - _bits &= ~1099511627776L; - _headers._Origin = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 134217728L) != 0) + { + _headers._Host = default(StringValues); + _bits &= ~134217728L; + if(_bits == 0) + { + return; + } + } - case 7: - { - if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 32L) != 0)) - { - _bits &= ~32L; - _headers._Trailer = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 128L) != 0)) - { - _bits &= ~128L; - _headers._Upgrade = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 512L) != 0)) - { - _bits &= ~512L; - _headers._Warning = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 131072L) != 0)) - { - _bits &= ~131072L; - _headers._Expires = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Referer".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 34359738368L) != 0)) - { - _bits &= ~34359738368L; - _headers._Referer = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 549755813888L) != 0) + { + _headers._UserAgent = default(StringValues); + _bits &= ~549755813888L; + if(_bits == 0) + { + return; + } + } - case 17: - { - if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 64L) != 0)) - { - _bits &= ~64L; - _headers._TransferEncoding = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("If-Modified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 536870912L) != 0)) - { - _bits &= ~536870912L; - _headers._IfModifiedSince = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 1L) != 0) + { + _headers._CacheControl = default(StringValues); + _bits &= ~1L; + if(_bits == 0) + { + return; + } + } - case 3: - { - if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 256L) != 0)) - { - _bits &= ~256L; - _headers._Via = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 2L) != 0) + { + _headers._Connection = default(StringValues); + _bits &= ~2L; + if(_bits == 0) + { + return; + } + } - case 5: - { - if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1024L) != 0)) - { - _bits &= ~1024L; - _headers._Allow = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Range".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 68719476736L) != 0)) - { - _bits &= ~68719476736L; - _headers._Range = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 4L) != 0) + { + _headers._Date = default(StringValues); + _bits &= ~4L; + if(_bits == 0) + { + return; + } + } - case 12: - { - if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - _bits &= ~2048L; - _headers._ContentType = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Max-Forwards".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8589934592L) != 0)) - { - _bits &= ~8589934592L; - _headers._MaxForwards = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 8L) != 0) + { + _headers._KeepAlive = default(StringValues); + _bits &= ~8L; + if(_bits == 0) + { + return; + } + } - case 16: - { - if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4096L) != 0)) - { - _bits &= ~4096L; - _headers._ContentEncoding = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8192L) != 0)) - { - _bits &= ~8192L; - _headers._ContentLanguage = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16384L) != 0)) - { - _bits &= ~16384L; - _headers._ContentLocation = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 16L) != 0) + { + _headers._Pragma = default(StringValues); + _bits &= ~16L; + if(_bits == 0) + { + return; + } + } - case 11: - { - if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 32768L) != 0)) - { - _bits &= ~32768L; - _headers._ContentMD5 = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 32L) != 0) + { + _headers._Trailer = default(StringValues); + _bits &= ~32L; + if(_bits == 0) + { + return; + } + } - case 14: - { - if ("Accept-Charset".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1048576L) != 0)) - { - _bits &= ~1048576L; - _headers._AcceptCharset = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (ContentLength.HasValue) - { - ContentLength = null; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 64L) != 0) + { + _headers._TransferEncoding = default(StringValues); + _bits &= ~64L; + if(_bits == 0) + { + return; + } + } - case 15: - { - if ("Accept-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2097152L) != 0)) - { - _bits &= ~2097152L; - _headers._AcceptEncoding = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Accept-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4194304L) != 0)) - { - _bits &= ~4194304L; - _headers._AcceptLanguage = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 128L) != 0) + { + _headers._Upgrade = default(StringValues); + _bits &= ~128L; + if(_bits == 0) + { + return; + } + } - case 8: - { - if ("If-Match".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 268435456L) != 0)) - { - _bits &= ~268435456L; - _headers._IfMatch = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("If-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2147483648L) != 0)) - { - _bits &= ~2147483648L; - _headers._IfRange = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; + if ((_bits & 256L) != 0) + { + _headers._Via = default(StringValues); + _bits &= ~256L; + if(_bits == 0) + { + return; + } + } - case 19: - { - if ("If-Unmodified-Since".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4294967296L) != 0)) - { - _bits &= ~4294967296L; - _headers._IfUnmodifiedSince = StringValues.Empty; - return true; - } - else - { - return false; - } - } - - if ("Proxy-Authorization".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 17179869184L) != 0)) - { - _bits &= ~17179869184L; - _headers._ProxyAuthorization = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - - case 2: - { - if ("TE".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 137438953472L) != 0)) - { - _bits &= ~137438953472L; - _headers._TE = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - - case 9: - { - if ("Translate".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 274877906944L) != 0)) - { - _bits &= ~274877906944L; - _headers._Translate = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - - case 29: - { - if ("Access-Control-Request-Method".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2199023255552L) != 0)) - { - _bits &= ~2199023255552L; - _headers._AccessControlRequestMethod = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - - case 30: - { - if ("Access-Control-Request-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4398046511104L) != 0)) - { - _bits &= ~4398046511104L; - _headers._AccessControlRequestHeaders = StringValues.Empty; - return true; - } - else - { - return false; - } - } - } - break; - } - return MaybeUnknown?.Remove(key) ?? false; - } - protected override void ClearFast() - { - MaybeUnknown?.Clear(); - ContentLength = null; - if(FrameHeaders.BitCount(_bits) > 11) - { - _headers = default(HeaderReferences); - _bits = 0; - return; - } - - if (((_bits & 524288L) != 0)) - { - _headers._Accept = default(StringValues); - _bits &= ~524288L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 134217728L) != 0)) - { - _headers._Host = default(StringValues); - _bits &= ~134217728L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 549755813888L) != 0)) - { - _headers._UserAgent = default(StringValues); - _bits &= ~549755813888L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 1L) != 0)) - { - _headers._CacheControl = default(StringValues); - _bits &= ~1L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 2L) != 0)) - { - _headers._Connection = default(StringValues); - _bits &= ~2L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 4L) != 0)) - { - _headers._Date = default(StringValues); - _bits &= ~4L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 8L) != 0)) - { - _headers._KeepAlive = default(StringValues); - _bits &= ~8L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 16L) != 0)) - { - _headers._Pragma = default(StringValues); - _bits &= ~16L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 32L) != 0)) - { - _headers._Trailer = default(StringValues); - _bits &= ~32L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 64L) != 0)) - { - _headers._TransferEncoding = default(StringValues); - _bits &= ~64L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 128L) != 0)) - { - _headers._Upgrade = default(StringValues); - _bits &= ~128L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 256L) != 0)) - { - _headers._Via = default(StringValues); - _bits &= ~256L; - if(_bits == 0) - { - return; - } - } - - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _headers._Warning = default(StringValues); _bits &= ~512L; @@ -3818,7 +2789,7 @@ protected override void ClearFast() } } - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _headers._Allow = default(StringValues); _bits &= ~1024L; @@ -3828,7 +2799,7 @@ protected override void ClearFast() } } - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _headers._ContentType = default(StringValues); _bits &= ~2048L; @@ -3838,7 +2809,7 @@ protected override void ClearFast() } } - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _headers._ContentEncoding = default(StringValues); _bits &= ~4096L; @@ -3848,7 +2819,7 @@ protected override void ClearFast() } } - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _headers._ContentLanguage = default(StringValues); _bits &= ~8192L; @@ -3858,7 +2829,7 @@ protected override void ClearFast() } } - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _headers._ContentLocation = default(StringValues); _bits &= ~16384L; @@ -3868,7 +2839,7 @@ protected override void ClearFast() } } - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _headers._ContentMD5 = default(StringValues); _bits &= ~32768L; @@ -3878,7 +2849,7 @@ protected override void ClearFast() } } - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _headers._ContentRange = default(StringValues); _bits &= ~65536L; @@ -3888,7 +2859,7 @@ protected override void ClearFast() } } - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _headers._Expires = default(StringValues); _bits &= ~131072L; @@ -3898,7 +2869,7 @@ protected override void ClearFast() } } - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _headers._LastModified = default(StringValues); _bits &= ~262144L; @@ -3908,7 +2879,7 @@ protected override void ClearFast() } } - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _headers._AcceptCharset = default(StringValues); _bits &= ~1048576L; @@ -3918,7 +2889,7 @@ protected override void ClearFast() } } - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _headers._AcceptEncoding = default(StringValues); _bits &= ~2097152L; @@ -3928,7 +2899,7 @@ protected override void ClearFast() } } - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _headers._AcceptLanguage = default(StringValues); _bits &= ~4194304L; @@ -3938,7 +2909,7 @@ protected override void ClearFast() } } - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _headers._Authorization = default(StringValues); _bits &= ~8388608L; @@ -3948,7 +2919,7 @@ protected override void ClearFast() } } - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _headers._Cookie = default(StringValues); _bits &= ~16777216L; @@ -3958,7 +2929,7 @@ protected override void ClearFast() } } - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _headers._Expect = default(StringValues); _bits &= ~33554432L; @@ -3968,7 +2939,7 @@ protected override void ClearFast() } } - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _headers._From = default(StringValues); _bits &= ~67108864L; @@ -3978,7 +2949,7 @@ protected override void ClearFast() } } - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _headers._IfMatch = default(StringValues); _bits &= ~268435456L; @@ -3988,7 +2959,7 @@ protected override void ClearFast() } } - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _headers._IfModifiedSince = default(StringValues); _bits &= ~536870912L; @@ -3998,7 +2969,7 @@ protected override void ClearFast() } } - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _headers._IfNoneMatch = default(StringValues); _bits &= ~1073741824L; @@ -4008,7 +2979,7 @@ protected override void ClearFast() } } - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _headers._IfRange = default(StringValues); _bits &= ~2147483648L; @@ -4018,7 +2989,7 @@ protected override void ClearFast() } } - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _headers._IfUnmodifiedSince = default(StringValues); _bits &= ~4294967296L; @@ -4028,7 +2999,7 @@ protected override void ClearFast() } } - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _headers._MaxForwards = default(StringValues); _bits &= ~8589934592L; @@ -4038,7 +3009,7 @@ protected override void ClearFast() } } - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _headers._ProxyAuthorization = default(StringValues); _bits &= ~17179869184L; @@ -4048,7 +3019,7 @@ protected override void ClearFast() } } - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { _headers._Referer = default(StringValues); _bits &= ~34359738368L; @@ -4058,7 +3029,7 @@ protected override void ClearFast() } } - if (((_bits & 68719476736L) != 0)) + if ((_bits & 68719476736L) != 0) { _headers._Range = default(StringValues); _bits &= ~68719476736L; @@ -4068,7 +3039,7 @@ protected override void ClearFast() } } - if (((_bits & 137438953472L) != 0)) + if ((_bits & 137438953472L) != 0) { _headers._TE = default(StringValues); _bits &= ~137438953472L; @@ -4078,7 +3049,7 @@ protected override void ClearFast() } } - if (((_bits & 274877906944L) != 0)) + if ((_bits & 274877906944L) != 0) { _headers._Translate = default(StringValues); _bits &= ~274877906944L; @@ -4088,7 +3059,7 @@ protected override void ClearFast() } } - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { _headers._Origin = default(StringValues); _bits &= ~1099511627776L; @@ -4098,7 +3069,7 @@ protected override void ClearFast() } } - if (((_bits & 2199023255552L) != 0)) + if ((_bits & 2199023255552L) != 0) { _headers._AccessControlRequestMethod = default(StringValues); _bits &= ~2199023255552L; @@ -4108,7 +3079,7 @@ protected override void ClearFast() } } - if (((_bits & 4398046511104L) != 0)) + if ((_bits & 4398046511104L) != 0) { _headers._AccessControlRequestHeaders = default(StringValues); _bits &= ~4398046511104L; @@ -4120,440 +3091,397 @@ protected override void ClearFast() } - protected override void CopyToFast(KeyValuePair[] array, int arrayIndex) + protected override bool CopyToFast(KeyValuePair[] array, int arrayIndex) { if (arrayIndex < 0) { - ThrowArgumentException(); + return false; } - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Cache-Control", _headers._CacheControl); ++arrayIndex; } - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Connection", _headers._Connection); ++arrayIndex; } - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Date", _headers._Date); ++arrayIndex; } - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Keep-Alive", _headers._KeepAlive); ++arrayIndex; } - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Pragma", _headers._Pragma); ++arrayIndex; } - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Trailer", _headers._Trailer); ++arrayIndex; } - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Transfer-Encoding", _headers._TransferEncoding); ++arrayIndex; } - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Upgrade", _headers._Upgrade); ++arrayIndex; } - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Via", _headers._Via); ++arrayIndex; } - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Warning", _headers._Warning); ++arrayIndex; } - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Allow", _headers._Allow); ++arrayIndex; } - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); ++arrayIndex; } - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); ++arrayIndex; } - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); ++arrayIndex; } - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); ++arrayIndex; } - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); ++arrayIndex; } - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); ++arrayIndex; } - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); ++arrayIndex; } - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); ++arrayIndex; } - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Accept", _headers._Accept); ++arrayIndex; } - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Accept-Charset", _headers._AcceptCharset); ++arrayIndex; } - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Accept-Encoding", _headers._AcceptEncoding); ++arrayIndex; } - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Accept-Language", _headers._AcceptLanguage); ++arrayIndex; } - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Authorization", _headers._Authorization); ++arrayIndex; } - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Cookie", _headers._Cookie); ++arrayIndex; } - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Expect", _headers._Expect); ++arrayIndex; } - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("From", _headers._From); ++arrayIndex; } - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Host", _headers._Host); ++arrayIndex; } - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("If-Match", _headers._IfMatch); ++arrayIndex; } - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("If-Modified-Since", _headers._IfModifiedSince); ++arrayIndex; } - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("If-None-Match", _headers._IfNoneMatch); ++arrayIndex; } - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("If-Range", _headers._IfRange); ++arrayIndex; } - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("If-Unmodified-Since", _headers._IfUnmodifiedSince); ++arrayIndex; } - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Max-Forwards", _headers._MaxForwards); ++arrayIndex; } - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Proxy-Authorization", _headers._ProxyAuthorization); ++arrayIndex; } - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Referer", _headers._Referer); ++arrayIndex; } - if (((_bits & 68719476736L) != 0)) + if ((_bits & 68719476736L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Range", _headers._Range); ++arrayIndex; } - if (((_bits & 137438953472L) != 0)) + if ((_bits & 137438953472L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("TE", _headers._TE); ++arrayIndex; } - if (((_bits & 274877906944L) != 0)) + if ((_bits & 274877906944L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Translate", _headers._Translate); ++arrayIndex; } - if (((_bits & 549755813888L) != 0)) + if ((_bits & 549755813888L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("User-Agent", _headers._UserAgent); ++arrayIndex; } - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Origin", _headers._Origin); ++arrayIndex; } - if (((_bits & 2199023255552L) != 0)) + if ((_bits & 2199023255552L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Request-Method", _headers._AccessControlRequestMethod); ++arrayIndex; } - if (((_bits & 4398046511104L) != 0)) + if ((_bits & 4398046511104L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Request-Headers", _headers._AccessControlRequestHeaders); ++arrayIndex; } @@ -4561,13 +3489,14 @@ protected override void CopyToFast(KeyValuePair[] array, i { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); + + return true; } @@ -4585,7 +3514,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUI[0] & 3755991007u) == 1162036033u) && ((pUS[2] & 57311u) == 21584u))) { - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { _headers._Accept = AppendValue(_headers._Accept, value); } @@ -4603,7 +3532,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUI[0] & 3755991007u) == 1414745928u))) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { _headers._Host = AppendValue(_headers._Host, value); } @@ -4621,7 +3550,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string { if ((((pUL[0] & 16131858680330051551uL) == 4992030374873092949uL) && ((pUS[4] & 57311u) == 21582u))) { - if (((_bits & 549755813888L) != 0)) + if ((_bits & 549755813888L) != 0) { _headers._UserAgent = AppendValue(_headers._UserAgent, value); } @@ -4636,18 +3565,13 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string break; } - + AppendNonPrimaryHeaders(ptr, keyOffset, keyLength, value); } - - AppendNonPrimaryHeaders(keyBytes, keyOffset, keyLength, value); } - private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int keyLength, string value) + private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int keyLength, string value) { - string key; - fixed (byte* ptr = &keyBytes[keyOffset]) - { - var pUB = ptr; + var pUB = pKeyBytes; var pUL = (ulong*)pUB; var pUI = (uint*)pUB; var pUS = (ushort*)pUB; @@ -4657,7 +3581,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131893727263186911uL) == 5711458528024281411uL) && ((pUI[2] & 3755991007u) == 1330795598u) && ((pUB[12] & 223u) == 76u))) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { _headers._CacheControl = AppendValue(_headers._CacheControl, value); } @@ -4671,7 +3595,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1196310866u) && ((pUB[12] & 223u) == 69u))) { - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _headers._ContentRange = AppendValue(_headers._ContentRange, value); } @@ -4685,7 +3609,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858680330051551uL) == 4922237774822850892uL) && ((pUI[2] & 3755991007u) == 1162430025u) && ((pUB[12] & 223u) == 68u))) { - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _headers._LastModified = AppendValue(_headers._LastModified, value); } @@ -4699,7 +3623,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542891098079uL) == 6505821637182772545uL) && ((pUI[2] & 3755991007u) == 1330205761u) && ((pUB[12] & 223u) == 78u))) { - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _headers._Authorization = AppendValue(_headers._Authorization, value); } @@ -4713,7 +3637,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552106889183uL) == 3262099607620765257uL) && ((pUI[2] & 3755991007u) == 1129595213u) && ((pUB[12] & 223u) == 72u))) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _headers._IfNoneMatch = AppendValue(_headers._IfNoneMatch, value); } @@ -4731,7 +3655,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542891098079uL) == 5283922227757993795uL) && ((pUS[4] & 57311u) == 20047u))) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { _headers._Connection = AppendValue(_headers._Connection, value); } @@ -4745,7 +3669,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858680330051551uL) == 5281668125874799947uL) && ((pUS[4] & 57311u) == 17750u))) { - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { _headers._KeepAlive = AppendValue(_headers._KeepAlive, value); } @@ -4763,7 +3687,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUI[0] & 3755991007u) == 1163149636u))) { - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { _headers._Date = AppendValue(_headers._Date, value); } @@ -4777,7 +3701,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1297044038u))) { - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _headers._From = AppendValue(_headers._From, value); } @@ -4795,7 +3719,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUI[0] & 3755991007u) == 1195463248u) && ((pUS[2] & 57311u) == 16717u))) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { _headers._Pragma = AppendValue(_headers._Pragma, value); } @@ -4809,7 +3733,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1263488835u) && ((pUS[2] & 57311u) == 17737u))) { - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _headers._Cookie = AppendValue(_headers._Cookie, value); } @@ -4823,7 +3747,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1162893381u) && ((pUS[2] & 57311u) == 21571u))) { - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _headers._Expect = AppendValue(_headers._Expect, value); } @@ -4837,7 +3761,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1195987535u) && ((pUS[2] & 57311u) == 20041u))) { - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { _headers._Origin = AppendValue(_headers._Origin, value); } @@ -4855,7 +3779,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUI[0] & 3755991007u) == 1229017684u) && ((pUS[2] & 57311u) == 17740u) && ((pUB[6] & 223u) == 82u))) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { _headers._Trailer = AppendValue(_headers._Trailer, value); } @@ -4869,7 +3793,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1380405333u) && ((pUS[2] & 57311u) == 17473u) && ((pUB[6] & 223u) == 69u))) { - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { _headers._Upgrade = AppendValue(_headers._Upgrade, value); } @@ -4883,7 +3807,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1314013527u) && ((pUS[2] & 57311u) == 20041u) && ((pUB[6] & 223u) == 71u))) { - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _headers._Warning = AppendValue(_headers._Warning, value); } @@ -4897,7 +3821,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1230002245u) && ((pUS[2] & 57311u) == 17746u) && ((pUB[6] & 223u) == 83u))) { - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _headers._Expires = AppendValue(_headers._Expires, value); } @@ -4911,7 +3835,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1162233170u) && ((pUS[2] & 57311u) == 17746u) && ((pUB[6] & 223u) == 82u))) { - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { _headers._Referer = AppendValue(_headers._Referer, value); } @@ -4929,7 +3853,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542891098079uL) == 5928221808112259668uL) && ((pUL[1] & 16131858542891098111uL) == 5641115115480565037uL) && ((pUB[16] & 223u) == 71u))) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { _headers._TransferEncoding = AppendValue(_headers._TransferEncoding, value); } @@ -4943,7 +3867,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542893195231uL) == 5064654363342751305uL) && ((pUL[1] & 16131858543427968991uL) == 4849894470315165001uL) && ((pUB[16] & 223u) == 69u))) { - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _headers._IfModifiedSince = AppendValue(_headers._IfModifiedSince, value); } @@ -4961,7 +3885,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUS[0] & 57311u) == 18774u) && ((pUB[2] & 223u) == 65u))) { - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { _headers._Via = AppendValue(_headers._Via, value); } @@ -4979,7 +3903,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUI[0] & 3755991007u) == 1330400321u) && ((pUB[4] & 223u) == 87u))) { - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _headers._Allow = AppendValue(_headers._Allow, value); } @@ -4993,7 +3917,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUI[0] & 3755991007u) == 1196310866u) && ((pUB[4] & 223u) == 69u))) { - if (((_bits & 68719476736L) != 0)) + if ((_bits & 68719476736L) != 0) { _headers._Range = AppendValue(_headers._Range, value); } @@ -5011,7 +3935,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1162893652u))) { - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _headers._ContentType = AppendValue(_headers._ContentType, value); } @@ -5025,7 +3949,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858543427968991uL) == 6292178792217067853uL) && ((pUI[2] & 3755991007u) == 1396986433u))) { - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _headers._MaxForwards = AppendValue(_headers._MaxForwards, value); } @@ -5043,7 +3967,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 5138124782612729413uL))) { - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _headers._ContentEncoding = AppendValue(_headers._ContentEncoding, value); } @@ -5057,7 +3981,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 4992030546487820620uL))) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _headers._ContentLanguage = AppendValue(_headers._ContentLanguage, value); } @@ -5071,7 +3995,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUL[1] & 16131858542891098079uL) == 5642809484339531596uL))) { - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _headers._ContentLocation = AppendValue(_headers._ContentLocation, value); } @@ -5089,7 +4013,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUS[4] & 57311u) == 17485u) && ((pUB[10] & 255u) == 53u))) { - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _headers._ContentMD5 = AppendValue(_headers._ContentMD5, value); } @@ -5107,7 +4031,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4840617878229304129uL) && ((pUI[2] & 3755991007u) == 1397899592u) && ((pUS[6] & 57311u) == 21573u))) { - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _headers._AcceptCharset = AppendValue(_headers._AcceptCharset, value); } @@ -5138,7 +4062,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4984733066305160001uL) && ((pUI[2] & 3755991007u) == 1146045262u) && ((pUS[6] & 57311u) == 20041u) && ((pUB[14] & 223u) == 71u))) { - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _headers._AcceptEncoding = AppendValue(_headers._AcceptEncoding, value); } @@ -5152,7 +4076,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16140865742145839071uL) == 5489136224570655553uL) && ((pUI[2] & 3755991007u) == 1430736449u) && ((pUS[6] & 57311u) == 18241u) && ((pUB[14] & 223u) == 69u))) { - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _headers._AcceptLanguage = AppendValue(_headers._AcceptLanguage, value); } @@ -5170,7 +4094,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542893195231uL) == 5207098233614845513uL))) { - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _headers._IfMatch = AppendValue(_headers._IfMatch, value); } @@ -5184,7 +4108,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131858542893195231uL) == 4992044754422023753uL))) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _headers._IfRange = AppendValue(_headers._IfRange, value); } @@ -5202,7 +4126,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542893195231uL) == 4922237916571059785uL) && ((pUL[1] & 16131893727263186911uL) == 5283616559079179849uL) && ((pUS[8] & 57311u) == 17230u) && ((pUB[18] & 223u) == 69u))) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _headers._IfUnmodifiedSince = AppendValue(_headers._IfUnmodifiedSince, value); } @@ -5216,7 +4140,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int if ((((pUL[0] & 16131893727263186911uL) == 6143241228466999888uL) && ((pUL[1] & 16131858542891098079uL) == 6071233043632179284uL) && ((pUS[8] & 57311u) == 20297u) && ((pUB[18] & 223u) == 78u))) { - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _headers._ProxyAuthorization = AppendValue(_headers._ProxyAuthorization, value); } @@ -5234,7 +4158,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUS[0] & 57311u) == 17748u))) { - if (((_bits & 137438953472L) != 0)) + if ((_bits & 137438953472L) != 0) { _headers._TE = AppendValue(_headers._TE, value); } @@ -5252,7 +4176,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16131858542891098079uL) == 6071217693351039572uL) && ((pUB[8] & 223u) == 69u))) { - if (((_bits & 274877906944L) != 0)) + if ((_bits & 274877906944L) != 0) { _headers._Translate = AppendValue(_headers._Translate, value); } @@ -5270,7 +4194,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4840616791602578241uL) && ((pUL[1] & 16140865742145839071uL) == 5921472988629454415uL) && ((pUL[2] & 16140865742145839071uL) == 5561193831494668613uL) && ((pUI[6] & 3755991007u) == 1330140229u) && ((pUB[28] & 223u) == 68u))) { - if (((_bits & 2199023255552L) != 0)) + if ((_bits & 2199023255552L) != 0) { _headers._AccessControlRequestMethod = AppendValue(_headers._AccessControlRequestMethod, value); } @@ -5288,7 +4212,7 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int { if ((((pUL[0] & 16140865742145839071uL) == 4840616791602578241uL) && ((pUL[1] & 16140865742145839071uL) == 5921472988629454415uL) && ((pUL[2] & 16140865742145839071uL) == 5200905861305028933uL) && ((pUI[6] & 3755991007u) == 1162101061u) && ((pUS[14] & 57311u) == 21330u))) { - if (((_bits & 4398046511104L) != 0)) + if ((_bits & 4398046511104L) != 0) { _headers._AccessControlRequestHeaders = AppendValue(_headers._AccessControlRequestHeaders, value); } @@ -5303,22 +4227,25 @@ private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int break; } - - key = new string('\0', keyLength); - fixed(char *keyBuffer = key) - { - if (!AsciiUtilities.TryGetAsciiString(ptr, keyBuffer, keyLength)) - { - throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); - } - } - + AppendUnknownHeaders(pKeyBytes, keyLength, value); + } + + private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string value) + { + string key = new string('\0', keyLength); + fixed (char* keyBuffer = key) + { + if (!AsciiUtilities.TryGetAsciiString(pKeyBytes, keyBuffer, keyLength)) + { + throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); + } } StringValues existing; Unknown.TryGetValue(key, out existing); Unknown[key] = AppendValue(existing, value); } + private struct HeaderReferences { public StringValues _CacheControl; @@ -5510,7 +4437,7 @@ public bool MoveNext() } state0: - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { _current = new KeyValuePair("Cache-Control", _collection._headers._CacheControl); _state = 1; @@ -5518,7 +4445,7 @@ public bool MoveNext() } state1: - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { _current = new KeyValuePair("Connection", _collection._headers._Connection); _state = 2; @@ -5526,7 +4453,7 @@ public bool MoveNext() } state2: - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { _current = new KeyValuePair("Date", _collection._headers._Date); _state = 3; @@ -5534,7 +4461,7 @@ public bool MoveNext() } state3: - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { _current = new KeyValuePair("Keep-Alive", _collection._headers._KeepAlive); _state = 4; @@ -5542,7 +4469,7 @@ public bool MoveNext() } state4: - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { _current = new KeyValuePair("Pragma", _collection._headers._Pragma); _state = 5; @@ -5550,7 +4477,7 @@ public bool MoveNext() } state5: - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { _current = new KeyValuePair("Trailer", _collection._headers._Trailer); _state = 6; @@ -5558,7 +4485,7 @@ public bool MoveNext() } state6: - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { _current = new KeyValuePair("Transfer-Encoding", _collection._headers._TransferEncoding); _state = 7; @@ -5566,7 +4493,7 @@ public bool MoveNext() } state7: - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { _current = new KeyValuePair("Upgrade", _collection._headers._Upgrade); _state = 8; @@ -5574,7 +4501,7 @@ public bool MoveNext() } state8: - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { _current = new KeyValuePair("Via", _collection._headers._Via); _state = 9; @@ -5582,7 +4509,7 @@ public bool MoveNext() } state9: - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _current = new KeyValuePair("Warning", _collection._headers._Warning); _state = 10; @@ -5590,7 +4517,7 @@ public bool MoveNext() } state10: - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _current = new KeyValuePair("Allow", _collection._headers._Allow); _state = 11; @@ -5598,7 +4525,7 @@ public bool MoveNext() } state11: - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); _state = 12; @@ -5606,7 +4533,7 @@ public bool MoveNext() } state12: - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); _state = 13; @@ -5614,7 +4541,7 @@ public bool MoveNext() } state13: - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); _state = 14; @@ -5622,7 +4549,7 @@ public bool MoveNext() } state14: - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); _state = 15; @@ -5630,7 +4557,7 @@ public bool MoveNext() } state15: - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); _state = 16; @@ -5638,7 +4565,7 @@ public bool MoveNext() } state16: - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); _state = 17; @@ -5646,7 +4573,7 @@ public bool MoveNext() } state17: - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _current = new KeyValuePair("Expires", _collection._headers._Expires); _state = 18; @@ -5654,7 +4581,7 @@ public bool MoveNext() } state18: - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); _state = 19; @@ -5662,7 +4589,7 @@ public bool MoveNext() } state19: - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { _current = new KeyValuePair("Accept", _collection._headers._Accept); _state = 20; @@ -5670,7 +4597,7 @@ public bool MoveNext() } state20: - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _current = new KeyValuePair("Accept-Charset", _collection._headers._AcceptCharset); _state = 21; @@ -5678,7 +4605,7 @@ public bool MoveNext() } state21: - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _current = new KeyValuePair("Accept-Encoding", _collection._headers._AcceptEncoding); _state = 22; @@ -5686,7 +4613,7 @@ public bool MoveNext() } state22: - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _current = new KeyValuePair("Accept-Language", _collection._headers._AcceptLanguage); _state = 23; @@ -5694,7 +4621,7 @@ public bool MoveNext() } state23: - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _current = new KeyValuePair("Authorization", _collection._headers._Authorization); _state = 24; @@ -5702,7 +4629,7 @@ public bool MoveNext() } state24: - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _current = new KeyValuePair("Cookie", _collection._headers._Cookie); _state = 25; @@ -5710,7 +4637,7 @@ public bool MoveNext() } state25: - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _current = new KeyValuePair("Expect", _collection._headers._Expect); _state = 26; @@ -5718,7 +4645,7 @@ public bool MoveNext() } state26: - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _current = new KeyValuePair("From", _collection._headers._From); _state = 27; @@ -5726,7 +4653,7 @@ public bool MoveNext() } state27: - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { _current = new KeyValuePair("Host", _collection._headers._Host); _state = 28; @@ -5734,7 +4661,7 @@ public bool MoveNext() } state28: - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _current = new KeyValuePair("If-Match", _collection._headers._IfMatch); _state = 29; @@ -5742,7 +4669,7 @@ public bool MoveNext() } state29: - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _current = new KeyValuePair("If-Modified-Since", _collection._headers._IfModifiedSince); _state = 30; @@ -5750,7 +4677,7 @@ public bool MoveNext() } state30: - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _current = new KeyValuePair("If-None-Match", _collection._headers._IfNoneMatch); _state = 31; @@ -5758,7 +4685,7 @@ public bool MoveNext() } state31: - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _current = new KeyValuePair("If-Range", _collection._headers._IfRange); _state = 32; @@ -5766,7 +4693,7 @@ public bool MoveNext() } state32: - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _current = new KeyValuePair("If-Unmodified-Since", _collection._headers._IfUnmodifiedSince); _state = 33; @@ -5774,7 +4701,7 @@ public bool MoveNext() } state33: - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _current = new KeyValuePair("Max-Forwards", _collection._headers._MaxForwards); _state = 34; @@ -5782,7 +4709,7 @@ public bool MoveNext() } state34: - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _current = new KeyValuePair("Proxy-Authorization", _collection._headers._ProxyAuthorization); _state = 35; @@ -5790,7 +4717,7 @@ public bool MoveNext() } state35: - if (((_bits & 34359738368L) != 0)) + if ((_bits & 34359738368L) != 0) { _current = new KeyValuePair("Referer", _collection._headers._Referer); _state = 36; @@ -5798,7 +4725,7 @@ public bool MoveNext() } state36: - if (((_bits & 68719476736L) != 0)) + if ((_bits & 68719476736L) != 0) { _current = new KeyValuePair("Range", _collection._headers._Range); _state = 37; @@ -5806,7 +4733,7 @@ public bool MoveNext() } state37: - if (((_bits & 137438953472L) != 0)) + if ((_bits & 137438953472L) != 0) { _current = new KeyValuePair("TE", _collection._headers._TE); _state = 38; @@ -5814,7 +4741,7 @@ public bool MoveNext() } state38: - if (((_bits & 274877906944L) != 0)) + if ((_bits & 274877906944L) != 0) { _current = new KeyValuePair("Translate", _collection._headers._Translate); _state = 39; @@ -5822,7 +4749,7 @@ public bool MoveNext() } state39: - if (((_bits & 549755813888L) != 0)) + if ((_bits & 549755813888L) != 0) { _current = new KeyValuePair("User-Agent", _collection._headers._UserAgent); _state = 40; @@ -5830,7 +4757,7 @@ public bool MoveNext() } state40: - if (((_bits & 1099511627776L) != 0)) + if ((_bits & 1099511627776L) != 0) { _current = new KeyValuePair("Origin", _collection._headers._Origin); _state = 41; @@ -5838,7 +4765,7 @@ public bool MoveNext() } state41: - if (((_bits & 2199023255552L) != 0)) + if ((_bits & 2199023255552L) != 0) { _current = new KeyValuePair("Access-Control-Request-Method", _collection._headers._AccessControlRequestMethod); _state = 42; @@ -5846,7 +4773,7 @@ public bool MoveNext() } state42: - if (((_bits & 4398046511104L) != 0)) + if ((_bits & 4398046511104L) != 0) { _current = new KeyValuePair("Access-Control-Request-Headers", _collection._headers._AccessControlRequestHeaders); _state = 43; @@ -5886,11 +4813,12 @@ public StringValues HeaderCacheControl { get { - if (((_bits & 1L) != 0)) + StringValues value; + if ((_bits & 1L) != 0) { - return _headers._CacheControl; + value = _headers._CacheControl; } - return StringValues.Empty; + return value; } set { @@ -5902,11 +4830,12 @@ public StringValues HeaderConnection { get { - if (((_bits & 2L) != 0)) + StringValues value; + if ((_bits & 2L) != 0) { - return _headers._Connection; + value = _headers._Connection; } - return StringValues.Empty; + return value; } set { @@ -5919,11 +4848,12 @@ public StringValues HeaderDate { get { - if (((_bits & 4L) != 0)) + StringValues value; + if ((_bits & 4L) != 0) { - return _headers._Date; + value = _headers._Date; } - return StringValues.Empty; + return value; } set { @@ -5936,11 +4866,12 @@ public StringValues HeaderKeepAlive { get { - if (((_bits & 8L) != 0)) + StringValues value; + if ((_bits & 8L) != 0) { - return _headers._KeepAlive; + value = _headers._KeepAlive; } - return StringValues.Empty; + return value; } set { @@ -5952,11 +4883,12 @@ public StringValues HeaderPragma { get { - if (((_bits & 16L) != 0)) + StringValues value; + if ((_bits & 16L) != 0) { - return _headers._Pragma; + value = _headers._Pragma; } - return StringValues.Empty; + return value; } set { @@ -5968,11 +4900,12 @@ public StringValues HeaderTrailer { get { - if (((_bits & 32L) != 0)) + StringValues value; + if ((_bits & 32L) != 0) { - return _headers._Trailer; + value = _headers._Trailer; } - return StringValues.Empty; + return value; } set { @@ -5984,11 +4917,12 @@ public StringValues HeaderTransferEncoding { get { - if (((_bits & 64L) != 0)) + StringValues value; + if ((_bits & 64L) != 0) { - return _headers._TransferEncoding; + value = _headers._TransferEncoding; } - return StringValues.Empty; + return value; } set { @@ -6001,11 +4935,12 @@ public StringValues HeaderUpgrade { get { - if (((_bits & 128L) != 0)) + StringValues value; + if ((_bits & 128L) != 0) { - return _headers._Upgrade; + value = _headers._Upgrade; } - return StringValues.Empty; + return value; } set { @@ -6017,11 +4952,12 @@ public StringValues HeaderVia { get { - if (((_bits & 256L) != 0)) + StringValues value; + if ((_bits & 256L) != 0) { - return _headers._Via; + value = _headers._Via; } - return StringValues.Empty; + return value; } set { @@ -6033,11 +4969,12 @@ public StringValues HeaderWarning { get { - if (((_bits & 512L) != 0)) + StringValues value; + if ((_bits & 512L) != 0) { - return _headers._Warning; + value = _headers._Warning; } - return StringValues.Empty; + return value; } set { @@ -6049,11 +4986,12 @@ public StringValues HeaderAllow { get { - if (((_bits & 1024L) != 0)) + StringValues value; + if ((_bits & 1024L) != 0) { - return _headers._Allow; + value = _headers._Allow; } - return StringValues.Empty; + return value; } set { @@ -6065,11 +5003,12 @@ public StringValues HeaderContentType { get { - if (((_bits & 2048L) != 0)) + StringValues value; + if ((_bits & 2048L) != 0) { - return _headers._ContentType; + value = _headers._ContentType; } - return StringValues.Empty; + return value; } set { @@ -6081,11 +5020,12 @@ public StringValues HeaderContentEncoding { get { - if (((_bits & 4096L) != 0)) + StringValues value; + if ((_bits & 4096L) != 0) { - return _headers._ContentEncoding; + value = _headers._ContentEncoding; } - return StringValues.Empty; + return value; } set { @@ -6097,11 +5037,12 @@ public StringValues HeaderContentLanguage { get { - if (((_bits & 8192L) != 0)) + StringValues value; + if ((_bits & 8192L) != 0) { - return _headers._ContentLanguage; + value = _headers._ContentLanguage; } - return StringValues.Empty; + return value; } set { @@ -6113,11 +5054,12 @@ public StringValues HeaderContentLocation { get { - if (((_bits & 16384L) != 0)) + StringValues value; + if ((_bits & 16384L) != 0) { - return _headers._ContentLocation; + value = _headers._ContentLocation; } - return StringValues.Empty; + return value; } set { @@ -6129,11 +5071,12 @@ public StringValues HeaderContentMD5 { get { - if (((_bits & 32768L) != 0)) + StringValues value; + if ((_bits & 32768L) != 0) { - return _headers._ContentMD5; + value = _headers._ContentMD5; } - return StringValues.Empty; + return value; } set { @@ -6145,11 +5088,12 @@ public StringValues HeaderContentRange { get { - if (((_bits & 65536L) != 0)) + StringValues value; + if ((_bits & 65536L) != 0) { - return _headers._ContentRange; + value = _headers._ContentRange; } - return StringValues.Empty; + return value; } set { @@ -6161,11 +5105,12 @@ public StringValues HeaderExpires { get { - if (((_bits & 131072L) != 0)) + StringValues value; + if ((_bits & 131072L) != 0) { - return _headers._Expires; + value = _headers._Expires; } - return StringValues.Empty; + return value; } set { @@ -6177,11 +5122,12 @@ public StringValues HeaderLastModified { get { - if (((_bits & 262144L) != 0)) + StringValues value; + if ((_bits & 262144L) != 0) { - return _headers._LastModified; + value = _headers._LastModified; } - return StringValues.Empty; + return value; } set { @@ -6193,803 +5139,321 @@ public StringValues HeaderAcceptRanges { get { - if (((_bits & 524288L) != 0)) - { - return _headers._AcceptRanges; - } - return StringValues.Empty; - } - set - { - _bits |= 524288L; - _headers._AcceptRanges = value; - } - } - public StringValues HeaderAge - { - get - { - if (((_bits & 1048576L) != 0)) - { - return _headers._Age; - } - return StringValues.Empty; - } - set - { - _bits |= 1048576L; - _headers._Age = value; - } - } - public StringValues HeaderETag - { - get - { - if (((_bits & 2097152L) != 0)) - { - return _headers._ETag; - } - return StringValues.Empty; - } - set - { - _bits |= 2097152L; - _headers._ETag = value; - } - } - public StringValues HeaderLocation - { - get - { - if (((_bits & 4194304L) != 0)) - { - return _headers._Location; - } - return StringValues.Empty; - } - set - { - _bits |= 4194304L; - _headers._Location = value; - } - } - public StringValues HeaderProxyAuthenticate - { - get - { - if (((_bits & 8388608L) != 0)) - { - return _headers._ProxyAuthenticate; - } - return StringValues.Empty; - } - set - { - _bits |= 8388608L; - _headers._ProxyAuthenticate = value; - } - } - public StringValues HeaderRetryAfter - { - get - { - if (((_bits & 16777216L) != 0)) - { - return _headers._RetryAfter; - } - return StringValues.Empty; - } - set - { - _bits |= 16777216L; - _headers._RetryAfter = value; - } - } - public StringValues HeaderServer - { - get - { - if (((_bits & 33554432L) != 0)) - { - return _headers._Server; - } - return StringValues.Empty; - } - set - { - _bits |= 33554432L; - _headers._Server = value; - _headers._rawServer = null; - } - } - public StringValues HeaderSetCookie - { - get - { - if (((_bits & 67108864L) != 0)) - { - return _headers._SetCookie; - } - return StringValues.Empty; - } - set - { - _bits |= 67108864L; - _headers._SetCookie = value; - } - } - public StringValues HeaderVary - { - get - { - if (((_bits & 134217728L) != 0)) - { - return _headers._Vary; - } - return StringValues.Empty; - } - set - { - _bits |= 134217728L; - _headers._Vary = value; - } - } - public StringValues HeaderWWWAuthenticate - { - get - { - if (((_bits & 268435456L) != 0)) - { - return _headers._WWWAuthenticate; - } - return StringValues.Empty; - } - set - { - _bits |= 268435456L; - _headers._WWWAuthenticate = value; - } - } - public StringValues HeaderAccessControlAllowCredentials - { - get - { - if (((_bits & 536870912L) != 0)) - { - return _headers._AccessControlAllowCredentials; - } - return StringValues.Empty; - } - set - { - _bits |= 536870912L; - _headers._AccessControlAllowCredentials = value; - } - } - public StringValues HeaderAccessControlAllowHeaders - { - get - { - if (((_bits & 1073741824L) != 0)) - { - return _headers._AccessControlAllowHeaders; - } - return StringValues.Empty; - } - set - { - _bits |= 1073741824L; - _headers._AccessControlAllowHeaders = value; - } - } - public StringValues HeaderAccessControlAllowMethods - { - get - { - if (((_bits & 2147483648L) != 0)) - { - return _headers._AccessControlAllowMethods; - } - return StringValues.Empty; - } - set - { - _bits |= 2147483648L; - _headers._AccessControlAllowMethods = value; - } - } - public StringValues HeaderAccessControlAllowOrigin - { - get - { - if (((_bits & 4294967296L) != 0)) - { - return _headers._AccessControlAllowOrigin; - } - return StringValues.Empty; - } - set - { - _bits |= 4294967296L; - _headers._AccessControlAllowOrigin = value; - } - } - public StringValues HeaderAccessControlExposeHeaders - { - get - { - if (((_bits & 8589934592L) != 0)) - { - return _headers._AccessControlExposeHeaders; - } - return StringValues.Empty; - } - set - { - _bits |= 8589934592L; - _headers._AccessControlExposeHeaders = value; - } - } - public StringValues HeaderAccessControlMaxAge - { - get - { - if (((_bits & 17179869184L) != 0)) - { - return _headers._AccessControlMaxAge; - } - return StringValues.Empty; - } - set - { - _bits |= 17179869184L; - _headers._AccessControlMaxAge = value; - } - } - public StringValues HeaderContentLength - { - get - { - if (ContentLength.HasValue) + StringValues value; + if ((_bits & 524288L) != 0) { - return HeaderUtilities.FormatInt64(ContentLength.Value); + value = _headers._AcceptRanges; } - return StringValues.Empty; - } - set - { - ContentLength = ParseResponseContentLength(value); - } - } - - public void SetRawConnection(StringValues value, byte[] raw) - { - _bits |= 2L; - _headers._Connection = value; - _headers._rawConnection = raw; - } - public void SetRawDate(StringValues value, byte[] raw) - { - _bits |= 4L; - _headers._Date = value; - _headers._rawDate = raw; - } - public void SetRawTransferEncoding(StringValues value, byte[] raw) - { - _bits |= 64L; - _headers._TransferEncoding = value; - _headers._rawTransferEncoding = raw; - } - public void SetRawServer(StringValues value, byte[] raw) - { - _bits |= 33554432L; - _headers._Server = value; - _headers._rawServer = raw; - } - protected override int GetCountFast() - { - return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); - } - protected override StringValues GetValueFast(string key) - { - switch (key.Length) - { - case 13: - { - if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1L) != 0)) - { - return _headers._CacheControl; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 65536L) != 0)) - { - return _headers._ContentRange; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 262144L) != 0)) - { - return _headers._LastModified; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 524288L) != 0)) - { - return _headers._AcceptRanges; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 10: - { - if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2L) != 0)) - { - return _headers._Connection; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8L) != 0)) - { - return _headers._KeepAlive; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 67108864L) != 0)) - { - return _headers._SetCookie; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 4: - { - if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4L) != 0)) - { - return _headers._Date; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2097152L) != 0)) - { - return _headers._ETag; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 134217728L) != 0)) - { - return _headers._Vary; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 6: - { - if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16L) != 0)) - { - return _headers._Pragma; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 33554432L) != 0)) - { - return _headers._Server; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 7: - { - if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 32L) != 0)) - { - return _headers._Trailer; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 128L) != 0)) - { - return _headers._Upgrade; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 512L) != 0)) - { - return _headers._Warning; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 131072L) != 0)) - { - return _headers._Expires; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 17: - { - if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 64L) != 0)) - { - return _headers._TransferEncoding; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 3: - { - if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 256L) != 0)) - { - return _headers._Via; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1048576L) != 0)) - { - return _headers._Age; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 5: - { - if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1024L) != 0)) - { - return _headers._Allow; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 12: - { - if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2048L) != 0)) - { - return _headers._ContentType; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 16: - { - if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4096L) != 0)) - { - return _headers._ContentEncoding; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8192L) != 0)) - { - return _headers._ContentLanguage; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16384L) != 0)) - { - return _headers._ContentLocation; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 268435456L) != 0)) - { - return _headers._WWWAuthenticate; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 11: - { - if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 32768L) != 0)) - { - return _headers._ContentMD5; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 16777216L) != 0)) - { - return _headers._RetryAfter; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 8: - { - if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4194304L) != 0)) - { - return _headers._Location; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 18: - { - if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8388608L) != 0)) - { - return _headers._ProxyAuthenticate; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 32: - { - if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 536870912L) != 0)) - { - return _headers._AccessControlAllowCredentials; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 28: - { - if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 1073741824L) != 0)) - { - return _headers._AccessControlAllowHeaders; - } - else - { - ThrowKeyNotFoundException(); - } - } - - if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 2147483648L) != 0)) - { - return _headers._AccessControlAllowMethods; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 27: - { - if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 4294967296L) != 0)) - { - return _headers._AccessControlAllowOrigin; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 29: - { - if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 8589934592L) != 0)) - { - return _headers._AccessControlExposeHeaders; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 22: - { - if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (((_bits & 17179869184L) != 0)) - { - return _headers._AccessControlMaxAge; - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; - case 14: - { - if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) - { - if (ContentLength.HasValue) - { - return HeaderUtilities.FormatInt64(ContentLength.Value); - } - else - { - ThrowKeyNotFoundException(); - } - } - } - break; + return value; } - if (MaybeUnknown == null) + set + { + _bits |= 524288L; + _headers._AcceptRanges = value; + } + } + public StringValues HeaderAge + { + get + { + StringValues value; + if ((_bits & 1048576L) != 0) + { + value = _headers._Age; + } + return value; + } + set + { + _bits |= 1048576L; + _headers._Age = value; + } + } + public StringValues HeaderETag + { + get + { + StringValues value; + if ((_bits & 2097152L) != 0) + { + value = _headers._ETag; + } + return value; + } + set + { + _bits |= 2097152L; + _headers._ETag = value; + } + } + public StringValues HeaderLocation + { + get + { + StringValues value; + if ((_bits & 4194304L) != 0) + { + value = _headers._Location; + } + return value; + } + set + { + _bits |= 4194304L; + _headers._Location = value; + } + } + public StringValues HeaderProxyAuthenticate + { + get + { + StringValues value; + if ((_bits & 8388608L) != 0) + { + value = _headers._ProxyAuthenticate; + } + return value; + } + set + { + _bits |= 8388608L; + _headers._ProxyAuthenticate = value; + } + } + public StringValues HeaderRetryAfter + { + get + { + StringValues value; + if ((_bits & 16777216L) != 0) + { + value = _headers._RetryAfter; + } + return value; + } + set + { + _bits |= 16777216L; + _headers._RetryAfter = value; + } + } + public StringValues HeaderServer + { + get + { + StringValues value; + if ((_bits & 33554432L) != 0) + { + value = _headers._Server; + } + return value; + } + set + { + _bits |= 33554432L; + _headers._Server = value; + _headers._rawServer = null; + } + } + public StringValues HeaderSetCookie + { + get + { + StringValues value; + if ((_bits & 67108864L) != 0) + { + value = _headers._SetCookie; + } + return value; + } + set + { + _bits |= 67108864L; + _headers._SetCookie = value; + } + } + public StringValues HeaderVary + { + get + { + StringValues value; + if ((_bits & 134217728L) != 0) + { + value = _headers._Vary; + } + return value; + } + set + { + _bits |= 134217728L; + _headers._Vary = value; + } + } + public StringValues HeaderWWWAuthenticate + { + get + { + StringValues value; + if ((_bits & 268435456L) != 0) + { + value = _headers._WWWAuthenticate; + } + return value; + } + set + { + _bits |= 268435456L; + _headers._WWWAuthenticate = value; + } + } + public StringValues HeaderAccessControlAllowCredentials + { + get + { + StringValues value; + if ((_bits & 536870912L) != 0) + { + value = _headers._AccessControlAllowCredentials; + } + return value; + } + set + { + _bits |= 536870912L; + _headers._AccessControlAllowCredentials = value; + } + } + public StringValues HeaderAccessControlAllowHeaders + { + get + { + StringValues value; + if ((_bits & 1073741824L) != 0) + { + value = _headers._AccessControlAllowHeaders; + } + return value; + } + set + { + _bits |= 1073741824L; + _headers._AccessControlAllowHeaders = value; + } + } + public StringValues HeaderAccessControlAllowMethods + { + get + { + StringValues value; + if ((_bits & 2147483648L) != 0) + { + value = _headers._AccessControlAllowMethods; + } + return value; + } + set + { + _bits |= 2147483648L; + _headers._AccessControlAllowMethods = value; + } + } + public StringValues HeaderAccessControlAllowOrigin + { + get + { + StringValues value; + if ((_bits & 4294967296L) != 0) + { + value = _headers._AccessControlAllowOrigin; + } + return value; + } + set + { + _bits |= 4294967296L; + _headers._AccessControlAllowOrigin = value; + } + } + public StringValues HeaderAccessControlExposeHeaders + { + get + { + StringValues value; + if ((_bits & 8589934592L) != 0) + { + value = _headers._AccessControlExposeHeaders; + } + return value; + } + set + { + _bits |= 8589934592L; + _headers._AccessControlExposeHeaders = value; + } + } + public StringValues HeaderAccessControlMaxAge + { + get { - ThrowKeyNotFoundException(); + StringValues value; + if ((_bits & 17179869184L) != 0) + { + value = _headers._AccessControlMaxAge; + } + return value; + } + set + { + _bits |= 17179869184L; + _headers._AccessControlMaxAge = value; + } + } + public StringValues HeaderContentLength + { + get + { + StringValues value; + if (ContentLength.HasValue) + { + value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); + } + return value; } - return MaybeUnknown[key]; + set + { + ContentLength = ParseResponseContentLength(value); + } + } + + public void SetRawConnection(StringValues value, byte[] raw) + { + _bits |= 2L; + _headers._Connection = value; + _headers._rawConnection = raw; + } + public void SetRawDate(StringValues value, byte[] raw) + { + _bits |= 4L; + _headers._Date = value; + _headers._rawDate = raw; + } + public void SetRawTransferEncoding(StringValues value, byte[] raw) + { + _bits |= 64L; + _headers._TransferEncoding = value; + _headers._rawTransferEncoding = raw; + } + public void SetRawServer(StringValues value, byte[] raw) + { + _bits |= 33554432L; + _headers._Server = value; + _headers._rawServer = raw; + } + protected override int GetCountFast() + { + return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } + protected override bool TryGetValueFast(string key, out StringValues value) { switch (key.Length) @@ -6998,564 +5462,389 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { value = _headers._CacheControl; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { value = _headers._ContentRange; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { value = _headers._LastModified; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { value = _headers._AcceptRanges; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { value = _headers._Connection; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { value = _headers._KeepAlive; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { value = _headers._SetCookie; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { value = _headers._Date; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { value = _headers._ETag; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { value = _headers._Vary; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { value = _headers._Pragma; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { value = _headers._Server; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { value = _headers._Trailer; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { value = _headers._Upgrade; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { value = _headers._Warning; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { value = _headers._Expires; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { value = _headers._TransferEncoding; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { value = _headers._Via; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { value = _headers._Age; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { value = _headers._Allow; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { value = _headers._ContentType; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { value = _headers._ContentEncoding; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { value = _headers._ContentLanguage; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { value = _headers._ContentLocation; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { value = _headers._WWWAuthenticate; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { value = _headers._ContentMD5; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { value = _headers._RetryAfter; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 8: { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { value = _headers._Location; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 18: { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { value = _headers._ProxyAuthenticate; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 32: { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { value = _headers._AccessControlAllowCredentials; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 28: { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { value = _headers._AccessControlAllowHeaders; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } - if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { value = _headers._AccessControlAllowMethods; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 27: { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { value = _headers._AccessControlAllowOrigin; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 29: { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { value = _headers._AccessControlExposeHeaders; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 22: { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { value = _headers._AccessControlMaxAge; return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; - case 14: { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7565,18 +5854,15 @@ protected override bool TryGetValueFast(string key, out StringValues value) value = HeaderUtilities.FormatInt64(ContentLength.Value); return true; } - else - { - value = StringValues.Empty; - return false; - } + return false; } } break; -} - value = StringValues.Empty; + } + return MaybeUnknown?.TryGetValue(key, out value) ?? false; } + protected override void SetValueFast(string key, StringValues value) { ValidateHeaderCharacters(value); @@ -7590,21 +5876,18 @@ protected override void SetValueFast(string key, StringValues value) _headers._CacheControl = value; return; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 65536L; _headers._ContentRange = value; return; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 262144L; _headers._LastModified = value; return; } - if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 524288L; @@ -7613,7 +5896,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7623,14 +5905,12 @@ protected override void SetValueFast(string key, StringValues value) _headers._rawConnection = null; return; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 8L; _headers._KeepAlive = value; return; } - if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 67108864L; @@ -7639,7 +5919,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7649,14 +5928,12 @@ protected override void SetValueFast(string key, StringValues value) _headers._rawDate = null; return; } - if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 2097152L; _headers._ETag = value; return; } - if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 134217728L; @@ -7665,7 +5942,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7674,7 +5950,6 @@ protected override void SetValueFast(string key, StringValues value) _headers._Pragma = value; return; } - if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 33554432L; @@ -7684,7 +5959,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7693,21 +5967,18 @@ protected override void SetValueFast(string key, StringValues value) _headers._Trailer = value; return; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 128L; _headers._Upgrade = value; return; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 512L; _headers._Warning = value; return; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 131072L; @@ -7716,7 +5987,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7728,7 +5998,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7737,7 +6006,6 @@ protected override void SetValueFast(string key, StringValues value) _headers._Via = value; return; } - if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 1048576L; @@ -7746,7 +6014,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7757,7 +6024,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7768,7 +6034,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7777,21 +6042,18 @@ protected override void SetValueFast(string key, StringValues value) _headers._ContentEncoding = value; return; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 8192L; _headers._ContentLanguage = value; return; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 16384L; _headers._ContentLocation = value; return; } - if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 268435456L; @@ -7800,7 +6062,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7809,7 +6070,6 @@ protected override void SetValueFast(string key, StringValues value) _headers._ContentMD5 = value; return; } - if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 16777216L; @@ -7818,7 +6078,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 8: { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7829,7 +6088,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 18: { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7840,7 +6098,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 32: { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7851,7 +6108,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 28: { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7860,7 +6116,6 @@ protected override void SetValueFast(string key, StringValues value) _headers._AccessControlAllowHeaders = value; return; } - if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { _bits |= 2147483648L; @@ -7869,7 +6124,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 27: { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7880,7 +6134,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 29: { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7891,7 +6144,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 22: { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7902,7 +6154,6 @@ protected override void SetValueFast(string key, StringValues value) } } break; - case 14: { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -7912,11 +6163,13 @@ protected override void SetValueFast(string key, StringValues value) } } break; -} + } + ValidateHeaderCharacters(key); Unknown[key] = value; } - protected override void AddValueFast(string key, StringValues value) + + protected override bool AddValueFast(string key, StringValues value) { ValidateHeaderCharacters(value); switch (key.Length) @@ -7925,483 +6178,449 @@ protected override void AddValueFast(string key, StringValues value) { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 1L; + _headers._CacheControl = value; + return true; } - _bits |= 1L; - _headers._CacheControl = value; - return; + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 65536L; + _headers._ContentRange = value; + return true; } - _bits |= 65536L; - _headers._ContentRange = value; - return; + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 262144L; + _headers._LastModified = value; + return true; } - _bits |= 262144L; - _headers._LastModified = value; - return; + return false; } - if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 524288L; + _headers._AcceptRanges = value; + return true; } - _bits |= 524288L; - _headers._AcceptRanges = value; - return; + return false; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 2L; + _headers._Connection = value; + _headers._rawConnection = null; + return true; } - _bits |= 2L; - _headers._Connection = value; - _headers._rawConnection = null; - return; + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) + if ((_bits & 8L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 8L; + _headers._KeepAlive = value; + return true; } - _bits |= 8L; - _headers._KeepAlive = value; - return; + return false; } - if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 67108864L; + _headers._SetCookie = value; + return true; } - _bits |= 67108864L; - _headers._SetCookie = value; - return; + return false; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) + if ((_bits & 4L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 4L; + _headers._Date = value; + _headers._rawDate = null; + return true; } - _bits |= 4L; - _headers._Date = value; - _headers._rawDate = null; - return; + return false; } - if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 2097152L; + _headers._ETag = value; + return true; } - _bits |= 2097152L; - _headers._ETag = value; - return; + return false; } - if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 134217728L; + _headers._Vary = value; + return true; } - _bits |= 134217728L; - _headers._Vary = value; - return; + return false; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 16L; + _headers._Pragma = value; + return true; } - _bits |= 16L; - _headers._Pragma = value; - return; + return false; } - if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 33554432L; + _headers._Server = value; + _headers._rawServer = null; + return true; } - _bits |= 33554432L; - _headers._Server = value; - _headers._rawServer = null; - return; + return false; } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 32L; + _headers._Trailer = value; + return true; } - _bits |= 32L; - _headers._Trailer = value; - return; + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) + if ((_bits & 128L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 128L; + _headers._Upgrade = value; + return true; } - _bits |= 128L; - _headers._Upgrade = value; - return; + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) + if ((_bits & 512L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 512L; + _headers._Warning = value; + return true; } - _bits |= 512L; - _headers._Warning = value; - return; + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 131072L; + _headers._Expires = value; + return true; } - _bits |= 131072L; - _headers._Expires = value; - return; + return false; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 64L; + _headers._TransferEncoding = value; + _headers._rawTransferEncoding = null; + return true; } - _bits |= 64L; - _headers._TransferEncoding = value; - _headers._rawTransferEncoding = null; - return; + return false; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) + if ((_bits & 256L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 256L; + _headers._Via = value; + return true; } - _bits |= 256L; - _headers._Via = value; - return; + return false; } - if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 1048576L; + _headers._Age = value; + return true; } - _bits |= 1048576L; - _headers._Age = value; - return; + return false; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 1024L; + _headers._Allow = value; + return true; } - _bits |= 1024L; - _headers._Allow = value; - return; + return false; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 2048L; + _headers._ContentType = value; + return true; } - _bits |= 2048L; - _headers._ContentType = value; - return; + return false; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 4096L; + _headers._ContentEncoding = value; + return true; } - _bits |= 4096L; - _headers._ContentEncoding = value; - return; + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) == 0) { - ThrowDuplicateKeyException(); - } - _bits |= 8192L; - _headers._ContentLanguage = value; - return; + _bits |= 8192L; + _headers._ContentLanguage = value; + return true; + } + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 16384L; + _headers._ContentLocation = value; + return true; } - _bits |= 16384L; - _headers._ContentLocation = value; - return; + return false; } - if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 268435456L; + _headers._WWWAuthenticate = value; + return true; } - _bits |= 268435456L; - _headers._WWWAuthenticate = value; - return; + return false; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 32768L; + _headers._ContentMD5 = value; + return true; } - _bits |= 32768L; - _headers._ContentMD5 = value; - return; + return false; } - if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 16777216L; + _headers._RetryAfter = value; + return true; } - _bits |= 16777216L; - _headers._RetryAfter = value; - return; + return false; } } break; - case 8: { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 4194304L; + _headers._Location = value; + return true; } - _bits |= 4194304L; - _headers._Location = value; - return; + return false; } } break; - case 18: { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 8388608L; + _headers._ProxyAuthenticate = value; + return true; } - _bits |= 8388608L; - _headers._ProxyAuthenticate = value; - return; + return false; } } break; - case 32: { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 536870912L; + _headers._AccessControlAllowCredentials = value; + return true; } - _bits |= 536870912L; - _headers._AccessControlAllowCredentials = value; - return; + return false; } } break; - case 28: { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 1073741824L; + _headers._AccessControlAllowHeaders = value; + return true; } - _bits |= 1073741824L; - _headers._AccessControlAllowHeaders = value; - return; + return false; } - if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 2147483648L; + _headers._AccessControlAllowMethods = value; + return true; } - _bits |= 2147483648L; - _headers._AccessControlAllowMethods = value; - return; + return false; } } break; - case 27: { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 4294967296L; + _headers._AccessControlAllowOrigin = value; + return true; } - _bits |= 4294967296L; - _headers._AccessControlAllowOrigin = value; - return; + return false; } } break; - case 29: { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 8589934592L; + _headers._AccessControlExposeHeaders = value; + return true; } - _bits |= 8589934592L; - _headers._AccessControlExposeHeaders = value; - return; + return false; } } break; - case 22: { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) == 0) { - ThrowDuplicateKeyException(); + _bits |= 17179869184L; + _headers._AccessControlMaxAge = value; + return true; } - _bits |= 17179869184L; - _headers._AccessControlMaxAge = value; - return; + return false; } } break; - case 14: { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) - { - ThrowDuplicateKeyException(); - } - else + if (!ContentLength.HasValue) { ContentLength = ParseResponseContentLength(value); + return true; } - return; + return false; } } break; } + ValidateHeaderCharacters(key); Unknown.Add(key, value); + // Return true, above will throw and exit for false + return true; } + protected override bool RemoveFast(string key) { switch (key.Length) @@ -8410,568 +6629,428 @@ protected override bool RemoveFast(string key) { if ("Cache-Control".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { _bits &= ~1L; - _headers._CacheControl = StringValues.Empty; + _headers._CacheControl = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Content-Range".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _bits &= ~65536L; - _headers._ContentRange = StringValues.Empty; + _headers._ContentRange = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Last-Modified".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _bits &= ~262144L; - _headers._LastModified = StringValues.Empty; + _headers._LastModified = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Accept-Ranges".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { _bits &= ~524288L; - _headers._AcceptRanges = StringValues.Empty; + _headers._AcceptRanges = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 10: { if ("Connection".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { _bits &= ~2L; - _headers._Connection = StringValues.Empty; + _headers._Connection = default(StringValues); _headers._rawConnection = null; return true; } - else - { - return false; - } + return false; } - if ("Keep-Alive".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { _bits &= ~8L; - _headers._KeepAlive = StringValues.Empty; + _headers._KeepAlive = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Set-Cookie".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _bits &= ~67108864L; - _headers._SetCookie = StringValues.Empty; + _headers._SetCookie = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 4: { if ("Date".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { _bits &= ~4L; - _headers._Date = StringValues.Empty; + _headers._Date = default(StringValues); _headers._rawDate = null; return true; } - else - { - return false; - } + return false; } - if ("ETag".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _bits &= ~2097152L; - _headers._ETag = StringValues.Empty; + _headers._ETag = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Vary".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { _bits &= ~134217728L; - _headers._Vary = StringValues.Empty; + _headers._Vary = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 6: { if ("Pragma".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { _bits &= ~16L; - _headers._Pragma = StringValues.Empty; + _headers._Pragma = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Server".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _bits &= ~33554432L; - _headers._Server = StringValues.Empty; + _headers._Server = default(StringValues); _headers._rawServer = null; return true; } - else - { - return false; - } + return false; } } break; - case 7: { if ("Trailer".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { _bits &= ~32L; - _headers._Trailer = StringValues.Empty; + _headers._Trailer = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Upgrade".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { _bits &= ~128L; - _headers._Upgrade = StringValues.Empty; + _headers._Upgrade = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Warning".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _bits &= ~512L; - _headers._Warning = StringValues.Empty; + _headers._Warning = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Expires".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _bits &= ~131072L; - _headers._Expires = StringValues.Empty; + _headers._Expires = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 17: { if ("Transfer-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { _bits &= ~64L; - _headers._TransferEncoding = StringValues.Empty; + _headers._TransferEncoding = default(StringValues); _headers._rawTransferEncoding = null; return true; } - else - { - return false; - } + return false; } } break; - case 3: { if ("Via".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { _bits &= ~256L; - _headers._Via = StringValues.Empty; + _headers._Via = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _bits &= ~1048576L; - _headers._Age = StringValues.Empty; + _headers._Age = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 5: { if ("Allow".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _bits &= ~1024L; - _headers._Allow = StringValues.Empty; + _headers._Allow = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 12: { if ("Content-Type".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _bits &= ~2048L; - _headers._ContentType = StringValues.Empty; + _headers._ContentType = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 16: { if ("Content-Encoding".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _bits &= ~4096L; - _headers._ContentEncoding = StringValues.Empty; + _headers._ContentEncoding = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Content-Language".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _bits &= ~8192L; - _headers._ContentLanguage = StringValues.Empty; + _headers._ContentLanguage = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Content-Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _bits &= ~16384L; - _headers._ContentLocation = StringValues.Empty; + _headers._ContentLocation = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("WWW-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _bits &= ~268435456L; - _headers._WWWAuthenticate = StringValues.Empty; + _headers._WWWAuthenticate = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 11: { if ("Content-MD5".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _bits &= ~32768L; - _headers._ContentMD5 = StringValues.Empty; + _headers._ContentMD5 = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Retry-After".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _bits &= ~16777216L; - _headers._RetryAfter = StringValues.Empty; + _headers._RetryAfter = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 8: { if ("Location".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _bits &= ~4194304L; - _headers._Location = StringValues.Empty; + _headers._Location = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 18: { if ("Proxy-Authenticate".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _bits &= ~8388608L; - _headers._ProxyAuthenticate = StringValues.Empty; + _headers._ProxyAuthenticate = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 32: { if ("Access-Control-Allow-Credentials".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _bits &= ~536870912L; - _headers._AccessControlAllowCredentials = StringValues.Empty; + _headers._AccessControlAllowCredentials = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 28: { if ("Access-Control-Allow-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _bits &= ~1073741824L; - _headers._AccessControlAllowHeaders = StringValues.Empty; + _headers._AccessControlAllowHeaders = default(StringValues); return true; } - else - { - return false; - } + return false; } - if ("Access-Control-Allow-Methods".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _bits &= ~2147483648L; - _headers._AccessControlAllowMethods = StringValues.Empty; + _headers._AccessControlAllowMethods = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 27: { if ("Access-Control-Allow-Origin".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _bits &= ~4294967296L; - _headers._AccessControlAllowOrigin = StringValues.Empty; + _headers._AccessControlAllowOrigin = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 29: { if ("Access-Control-Expose-Headers".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _bits &= ~8589934592L; - _headers._AccessControlExposeHeaders = StringValues.Empty; + _headers._AccessControlExposeHeaders = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 22: { if ("Access-Control-Max-Age".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _bits &= ~17179869184L; - _headers._AccessControlMaxAge = StringValues.Empty; + _headers._AccessControlMaxAge = default(StringValues); return true; } - else - { - return false; - } + return false; } } break; - case 14: { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) @@ -8981,28 +7060,27 @@ protected override bool RemoveFast(string key) ContentLength = null; return true; } - else - { - return false; - } + return false; } } break; } + return MaybeUnknown?.Remove(key) ?? false; } + protected override void ClearFast() - { + { MaybeUnknown?.Clear(); ContentLength = null; - if(FrameHeaders.BitCount(_bits) > 11) + if(FrameHeaders.BitCount(_bits) > 12) { _headers = default(HeaderReferences); _bits = 0; return; } - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { _headers._Connection = default(StringValues); _bits &= ~2L; @@ -9012,7 +7090,7 @@ protected override void ClearFast() } } - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { _headers._Date = default(StringValues); _bits &= ~4L; @@ -9022,7 +7100,7 @@ protected override void ClearFast() } } - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _headers._ContentType = default(StringValues); _bits &= ~2048L; @@ -9032,7 +7110,7 @@ protected override void ClearFast() } } - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _headers._Server = default(StringValues); _bits &= ~33554432L; @@ -9042,7 +7120,7 @@ protected override void ClearFast() } } - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { _headers._CacheControl = default(StringValues); _bits &= ~1L; @@ -9052,7 +7130,7 @@ protected override void ClearFast() } } - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { _headers._KeepAlive = default(StringValues); _bits &= ~8L; @@ -9062,7 +7140,7 @@ protected override void ClearFast() } } - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { _headers._Pragma = default(StringValues); _bits &= ~16L; @@ -9072,7 +7150,7 @@ protected override void ClearFast() } } - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { _headers._Trailer = default(StringValues); _bits &= ~32L; @@ -9082,7 +7160,7 @@ protected override void ClearFast() } } - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { _headers._TransferEncoding = default(StringValues); _bits &= ~64L; @@ -9092,7 +7170,7 @@ protected override void ClearFast() } } - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { _headers._Upgrade = default(StringValues); _bits &= ~128L; @@ -9102,7 +7180,7 @@ protected override void ClearFast() } } - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { _headers._Via = default(StringValues); _bits &= ~256L; @@ -9112,7 +7190,7 @@ protected override void ClearFast() } } - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _headers._Warning = default(StringValues); _bits &= ~512L; @@ -9122,7 +7200,7 @@ protected override void ClearFast() } } - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _headers._Allow = default(StringValues); _bits &= ~1024L; @@ -9132,7 +7210,7 @@ protected override void ClearFast() } } - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _headers._ContentEncoding = default(StringValues); _bits &= ~4096L; @@ -9142,7 +7220,7 @@ protected override void ClearFast() } } - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _headers._ContentLanguage = default(StringValues); _bits &= ~8192L; @@ -9152,7 +7230,7 @@ protected override void ClearFast() } } - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _headers._ContentLocation = default(StringValues); _bits &= ~16384L; @@ -9162,7 +7240,7 @@ protected override void ClearFast() } } - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _headers._ContentMD5 = default(StringValues); _bits &= ~32768L; @@ -9172,7 +7250,7 @@ protected override void ClearFast() } } - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _headers._ContentRange = default(StringValues); _bits &= ~65536L; @@ -9182,7 +7260,7 @@ protected override void ClearFast() } } - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _headers._Expires = default(StringValues); _bits &= ~131072L; @@ -9192,7 +7270,7 @@ protected override void ClearFast() } } - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _headers._LastModified = default(StringValues); _bits &= ~262144L; @@ -9202,7 +7280,7 @@ protected override void ClearFast() } } - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { _headers._AcceptRanges = default(StringValues); _bits &= ~524288L; @@ -9212,7 +7290,7 @@ protected override void ClearFast() } } - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _headers._Age = default(StringValues); _bits &= ~1048576L; @@ -9222,7 +7300,7 @@ protected override void ClearFast() } } - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _headers._ETag = default(StringValues); _bits &= ~2097152L; @@ -9232,7 +7310,7 @@ protected override void ClearFast() } } - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _headers._Location = default(StringValues); _bits &= ~4194304L; @@ -9242,7 +7320,7 @@ protected override void ClearFast() } } - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _headers._ProxyAuthenticate = default(StringValues); _bits &= ~8388608L; @@ -9252,7 +7330,7 @@ protected override void ClearFast() } } - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _headers._RetryAfter = default(StringValues); _bits &= ~16777216L; @@ -9262,7 +7340,7 @@ protected override void ClearFast() } } - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _headers._SetCookie = default(StringValues); _bits &= ~67108864L; @@ -9272,7 +7350,7 @@ protected override void ClearFast() } } - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { _headers._Vary = default(StringValues); _bits &= ~134217728L; @@ -9282,7 +7360,7 @@ protected override void ClearFast() } } - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _headers._WWWAuthenticate = default(StringValues); _bits &= ~268435456L; @@ -9292,7 +7370,7 @@ protected override void ClearFast() } } - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _headers._AccessControlAllowCredentials = default(StringValues); _bits &= ~536870912L; @@ -9302,7 +7380,7 @@ protected override void ClearFast() } } - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _headers._AccessControlAllowHeaders = default(StringValues); _bits &= ~1073741824L; @@ -9312,7 +7390,7 @@ protected override void ClearFast() } } - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _headers._AccessControlAllowMethods = default(StringValues); _bits &= ~2147483648L; @@ -9322,7 +7400,7 @@ protected override void ClearFast() } } - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _headers._AccessControlAllowOrigin = default(StringValues); _bits &= ~4294967296L; @@ -9332,7 +7410,7 @@ protected override void ClearFast() } } - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _headers._AccessControlExposeHeaders = default(StringValues); _bits &= ~8589934592L; @@ -9342,7 +7420,7 @@ protected override void ClearFast() } } - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _headers._AccessControlMaxAge = default(StringValues); _bits &= ~17179869184L; @@ -9354,360 +7432,325 @@ protected override void ClearFast() } - protected override void CopyToFast(KeyValuePair[] array, int arrayIndex) + protected override bool CopyToFast(KeyValuePair[] array, int arrayIndex) { if (arrayIndex < 0) { - ThrowArgumentException(); + return false; } - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Cache-Control", _headers._CacheControl); ++arrayIndex; } - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Connection", _headers._Connection); ++arrayIndex; } - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Date", _headers._Date); ++arrayIndex; } - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Keep-Alive", _headers._KeepAlive); ++arrayIndex; } - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Pragma", _headers._Pragma); ++arrayIndex; } - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Trailer", _headers._Trailer); ++arrayIndex; } - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Transfer-Encoding", _headers._TransferEncoding); ++arrayIndex; } - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Upgrade", _headers._Upgrade); ++arrayIndex; } - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Via", _headers._Via); ++arrayIndex; } - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Warning", _headers._Warning); ++arrayIndex; } - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Allow", _headers._Allow); ++arrayIndex; } - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Type", _headers._ContentType); ++arrayIndex; } - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Encoding", _headers._ContentEncoding); ++arrayIndex; } - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Language", _headers._ContentLanguage); ++arrayIndex; } - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Location", _headers._ContentLocation); ++arrayIndex; } - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-MD5", _headers._ContentMD5); ++arrayIndex; } - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Range", _headers._ContentRange); ++arrayIndex; } - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Expires", _headers._Expires); ++arrayIndex; } - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Last-Modified", _headers._LastModified); ++arrayIndex; } - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Accept-Ranges", _headers._AcceptRanges); ++arrayIndex; } - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Age", _headers._Age); ++arrayIndex; } - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("ETag", _headers._ETag); ++arrayIndex; } - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Location", _headers._Location); ++arrayIndex; } - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Proxy-Authenticate", _headers._ProxyAuthenticate); ++arrayIndex; } - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Retry-After", _headers._RetryAfter); ++arrayIndex; } - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Server", _headers._Server); ++arrayIndex; } - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Set-Cookie", _headers._SetCookie); ++arrayIndex; } - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Vary", _headers._Vary); ++arrayIndex; } - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("WWW-Authenticate", _headers._WWWAuthenticate); ++arrayIndex; } - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Credentials", _headers._AccessControlAllowCredentials); ++arrayIndex; } - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Headers", _headers._AccessControlAllowHeaders); ++arrayIndex; } - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Methods", _headers._AccessControlAllowMethods); ++arrayIndex; } - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Allow-Origin", _headers._AccessControlAllowOrigin); ++arrayIndex; } - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Expose-Headers", _headers._AccessControlExposeHeaders); ++arrayIndex; } - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Access-Control-Max-Age", _headers._AccessControlMaxAge); ++arrayIndex; } @@ -9715,13 +7758,14 @@ protected override void CopyToFast(KeyValuePair[] array, i { if (arrayIndex == array.Length) { - ThrowArgumentException(); + return false; } - array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); + + return true; } protected void CopyToFast(ref MemoryPoolIterator output) @@ -9729,7 +7773,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) var tempBits = _bits | (ContentLength.HasValue ? -9223372036854775808L : 0); - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { if (_headers._rawConnection != null) { @@ -9757,7 +7801,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { if (_headers._rawDate != null) { @@ -9785,7 +7829,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { { var valueCount = _headers._ContentType.Count; @@ -9808,7 +7852,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { if (_headers._rawServer != null) { @@ -9849,7 +7893,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { { var valueCount = _headers._CacheControl.Count; @@ -9872,7 +7916,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { { var valueCount = _headers._KeepAlive.Count; @@ -9895,7 +7939,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { { var valueCount = _headers._Pragma.Count; @@ -9918,7 +7962,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { { var valueCount = _headers._Trailer.Count; @@ -9941,7 +7985,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { if (_headers._rawTransferEncoding != null) { @@ -9969,7 +8013,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { { var valueCount = _headers._Upgrade.Count; @@ -9992,7 +8036,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { { var valueCount = _headers._Via.Count; @@ -10015,7 +8059,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { { var valueCount = _headers._Warning.Count; @@ -10038,7 +8082,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { { var valueCount = _headers._Allow.Count; @@ -10061,7 +8105,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { { var valueCount = _headers._ContentEncoding.Count; @@ -10084,7 +8128,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { { var valueCount = _headers._ContentLanguage.Count; @@ -10107,7 +8151,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { { var valueCount = _headers._ContentLocation.Count; @@ -10130,7 +8174,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { { var valueCount = _headers._ContentMD5.Count; @@ -10153,7 +8197,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { { var valueCount = _headers._ContentRange.Count; @@ -10176,7 +8220,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { { var valueCount = _headers._Expires.Count; @@ -10199,7 +8243,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { { var valueCount = _headers._LastModified.Count; @@ -10222,7 +8266,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { { var valueCount = _headers._AcceptRanges.Count; @@ -10245,7 +8289,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { { var valueCount = _headers._Age.Count; @@ -10268,7 +8312,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { { var valueCount = _headers._ETag.Count; @@ -10291,7 +8335,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { { var valueCount = _headers._Location.Count; @@ -10314,7 +8358,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { { var valueCount = _headers._ProxyAuthenticate.Count; @@ -10337,7 +8381,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { { var valueCount = _headers._RetryAfter.Count; @@ -10360,7 +8404,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { { var valueCount = _headers._SetCookie.Count; @@ -10383,7 +8427,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { { var valueCount = _headers._Vary.Count; @@ -10406,7 +8450,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { { var valueCount = _headers._WWWAuthenticate.Count; @@ -10429,7 +8473,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { { var valueCount = _headers._AccessControlAllowCredentials.Count; @@ -10452,7 +8496,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { { var valueCount = _headers._AccessControlAllowHeaders.Count; @@ -10475,7 +8519,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { { var valueCount = _headers._AccessControlAllowMethods.Count; @@ -10498,7 +8542,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { { var valueCount = _headers._AccessControlAllowOrigin.Count; @@ -10521,7 +8565,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { { var valueCount = _headers._AccessControlExposeHeaders.Count; @@ -10544,7 +8588,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { { var valueCount = _headers._AccessControlMaxAge.Count; @@ -10568,8 +8612,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - - + private struct HeaderReferences { public StringValues _CacheControl; @@ -10733,7 +8776,7 @@ public bool MoveNext() } state0: - if (((_bits & 1L) != 0)) + if ((_bits & 1L) != 0) { _current = new KeyValuePair("Cache-Control", _collection._headers._CacheControl); _state = 1; @@ -10741,7 +8784,7 @@ public bool MoveNext() } state1: - if (((_bits & 2L) != 0)) + if ((_bits & 2L) != 0) { _current = new KeyValuePair("Connection", _collection._headers._Connection); _state = 2; @@ -10749,7 +8792,7 @@ public bool MoveNext() } state2: - if (((_bits & 4L) != 0)) + if ((_bits & 4L) != 0) { _current = new KeyValuePair("Date", _collection._headers._Date); _state = 3; @@ -10757,7 +8800,7 @@ public bool MoveNext() } state3: - if (((_bits & 8L) != 0)) + if ((_bits & 8L) != 0) { _current = new KeyValuePair("Keep-Alive", _collection._headers._KeepAlive); _state = 4; @@ -10765,7 +8808,7 @@ public bool MoveNext() } state4: - if (((_bits & 16L) != 0)) + if ((_bits & 16L) != 0) { _current = new KeyValuePair("Pragma", _collection._headers._Pragma); _state = 5; @@ -10773,7 +8816,7 @@ public bool MoveNext() } state5: - if (((_bits & 32L) != 0)) + if ((_bits & 32L) != 0) { _current = new KeyValuePair("Trailer", _collection._headers._Trailer); _state = 6; @@ -10781,7 +8824,7 @@ public bool MoveNext() } state6: - if (((_bits & 64L) != 0)) + if ((_bits & 64L) != 0) { _current = new KeyValuePair("Transfer-Encoding", _collection._headers._TransferEncoding); _state = 7; @@ -10789,7 +8832,7 @@ public bool MoveNext() } state7: - if (((_bits & 128L) != 0)) + if ((_bits & 128L) != 0) { _current = new KeyValuePair("Upgrade", _collection._headers._Upgrade); _state = 8; @@ -10797,7 +8840,7 @@ public bool MoveNext() } state8: - if (((_bits & 256L) != 0)) + if ((_bits & 256L) != 0) { _current = new KeyValuePair("Via", _collection._headers._Via); _state = 9; @@ -10805,7 +8848,7 @@ public bool MoveNext() } state9: - if (((_bits & 512L) != 0)) + if ((_bits & 512L) != 0) { _current = new KeyValuePair("Warning", _collection._headers._Warning); _state = 10; @@ -10813,7 +8856,7 @@ public bool MoveNext() } state10: - if (((_bits & 1024L) != 0)) + if ((_bits & 1024L) != 0) { _current = new KeyValuePair("Allow", _collection._headers._Allow); _state = 11; @@ -10821,7 +8864,7 @@ public bool MoveNext() } state11: - if (((_bits & 2048L) != 0)) + if ((_bits & 2048L) != 0) { _current = new KeyValuePair("Content-Type", _collection._headers._ContentType); _state = 12; @@ -10829,7 +8872,7 @@ public bool MoveNext() } state12: - if (((_bits & 4096L) != 0)) + if ((_bits & 4096L) != 0) { _current = new KeyValuePair("Content-Encoding", _collection._headers._ContentEncoding); _state = 13; @@ -10837,7 +8880,7 @@ public bool MoveNext() } state13: - if (((_bits & 8192L) != 0)) + if ((_bits & 8192L) != 0) { _current = new KeyValuePair("Content-Language", _collection._headers._ContentLanguage); _state = 14; @@ -10845,7 +8888,7 @@ public bool MoveNext() } state14: - if (((_bits & 16384L) != 0)) + if ((_bits & 16384L) != 0) { _current = new KeyValuePair("Content-Location", _collection._headers._ContentLocation); _state = 15; @@ -10853,7 +8896,7 @@ public bool MoveNext() } state15: - if (((_bits & 32768L) != 0)) + if ((_bits & 32768L) != 0) { _current = new KeyValuePair("Content-MD5", _collection._headers._ContentMD5); _state = 16; @@ -10861,7 +8904,7 @@ public bool MoveNext() } state16: - if (((_bits & 65536L) != 0)) + if ((_bits & 65536L) != 0) { _current = new KeyValuePair("Content-Range", _collection._headers._ContentRange); _state = 17; @@ -10869,7 +8912,7 @@ public bool MoveNext() } state17: - if (((_bits & 131072L) != 0)) + if ((_bits & 131072L) != 0) { _current = new KeyValuePair("Expires", _collection._headers._Expires); _state = 18; @@ -10877,7 +8920,7 @@ public bool MoveNext() } state18: - if (((_bits & 262144L) != 0)) + if ((_bits & 262144L) != 0) { _current = new KeyValuePair("Last-Modified", _collection._headers._LastModified); _state = 19; @@ -10885,7 +8928,7 @@ public bool MoveNext() } state19: - if (((_bits & 524288L) != 0)) + if ((_bits & 524288L) != 0) { _current = new KeyValuePair("Accept-Ranges", _collection._headers._AcceptRanges); _state = 20; @@ -10893,7 +8936,7 @@ public bool MoveNext() } state20: - if (((_bits & 1048576L) != 0)) + if ((_bits & 1048576L) != 0) { _current = new KeyValuePair("Age", _collection._headers._Age); _state = 21; @@ -10901,7 +8944,7 @@ public bool MoveNext() } state21: - if (((_bits & 2097152L) != 0)) + if ((_bits & 2097152L) != 0) { _current = new KeyValuePair("ETag", _collection._headers._ETag); _state = 22; @@ -10909,7 +8952,7 @@ public bool MoveNext() } state22: - if (((_bits & 4194304L) != 0)) + if ((_bits & 4194304L) != 0) { _current = new KeyValuePair("Location", _collection._headers._Location); _state = 23; @@ -10917,7 +8960,7 @@ public bool MoveNext() } state23: - if (((_bits & 8388608L) != 0)) + if ((_bits & 8388608L) != 0) { _current = new KeyValuePair("Proxy-Authenticate", _collection._headers._ProxyAuthenticate); _state = 24; @@ -10925,7 +8968,7 @@ public bool MoveNext() } state24: - if (((_bits & 16777216L) != 0)) + if ((_bits & 16777216L) != 0) { _current = new KeyValuePair("Retry-After", _collection._headers._RetryAfter); _state = 25; @@ -10933,7 +8976,7 @@ public bool MoveNext() } state25: - if (((_bits & 33554432L) != 0)) + if ((_bits & 33554432L) != 0) { _current = new KeyValuePair("Server", _collection._headers._Server); _state = 26; @@ -10941,7 +8984,7 @@ public bool MoveNext() } state26: - if (((_bits & 67108864L) != 0)) + if ((_bits & 67108864L) != 0) { _current = new KeyValuePair("Set-Cookie", _collection._headers._SetCookie); _state = 27; @@ -10949,7 +8992,7 @@ public bool MoveNext() } state27: - if (((_bits & 134217728L) != 0)) + if ((_bits & 134217728L) != 0) { _current = new KeyValuePair("Vary", _collection._headers._Vary); _state = 28; @@ -10957,7 +9000,7 @@ public bool MoveNext() } state28: - if (((_bits & 268435456L) != 0)) + if ((_bits & 268435456L) != 0) { _current = new KeyValuePair("WWW-Authenticate", _collection._headers._WWWAuthenticate); _state = 29; @@ -10965,7 +9008,7 @@ public bool MoveNext() } state29: - if (((_bits & 536870912L) != 0)) + if ((_bits & 536870912L) != 0) { _current = new KeyValuePair("Access-Control-Allow-Credentials", _collection._headers._AccessControlAllowCredentials); _state = 30; @@ -10973,7 +9016,7 @@ public bool MoveNext() } state30: - if (((_bits & 1073741824L) != 0)) + if ((_bits & 1073741824L) != 0) { _current = new KeyValuePair("Access-Control-Allow-Headers", _collection._headers._AccessControlAllowHeaders); _state = 31; @@ -10981,7 +9024,7 @@ public bool MoveNext() } state31: - if (((_bits & 2147483648L) != 0)) + if ((_bits & 2147483648L) != 0) { _current = new KeyValuePair("Access-Control-Allow-Methods", _collection._headers._AccessControlAllowMethods); _state = 32; @@ -10989,7 +9032,7 @@ public bool MoveNext() } state32: - if (((_bits & 4294967296L) != 0)) + if ((_bits & 4294967296L) != 0) { _current = new KeyValuePair("Access-Control-Allow-Origin", _collection._headers._AccessControlAllowOrigin); _state = 33; @@ -10997,7 +9040,7 @@ public bool MoveNext() } state33: - if (((_bits & 8589934592L) != 0)) + if ((_bits & 8589934592L) != 0) { _current = new KeyValuePair("Access-Control-Expose-Headers", _collection._headers._AccessControlExposeHeaders); _state = 34; @@ -11005,7 +9048,7 @@ public bool MoveNext() } state34: - if (((_bits & 17179869184L) != 0)) + if ((_bits & 17179869184L) != 0) { _current = new KeyValuePair("Access-Control-Max-Age", _collection._headers._AccessControlMaxAge); _state = 35; diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index 557c6249e..1cedf3197 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -53,7 +53,12 @@ StringValues IDictionary.this[string key] get { // Unlike the IHeaderDictionary version, this getter will throw a KeyNotFoundException. - return GetValueFast(key); + StringValues value; + if (!TryGetValueFast(key, out value)) + { + ThrowKeyNotFoundException(); + } + return value; } set { @@ -124,16 +129,13 @@ protected static int BitCount(long value) protected virtual int GetCountFast() { throw new NotImplementedException(); } - protected virtual StringValues GetValueFast(string key) - { throw new NotImplementedException(); } - protected virtual bool TryGetValueFast(string key, out StringValues value) { throw new NotImplementedException(); } protected virtual void SetValueFast(string key, StringValues value) { throw new NotImplementedException(); } - protected virtual void AddValueFast(string key, StringValues value) + protected virtual bool AddValueFast(string key, StringValues value) { throw new NotImplementedException(); } protected virtual bool RemoveFast(string key) @@ -142,7 +144,7 @@ protected virtual bool RemoveFast(string key) protected virtual void ClearFast() { throw new NotImplementedException(); } - protected virtual void CopyToFast(KeyValuePair[] array, int arrayIndex) + protected virtual bool CopyToFast(KeyValuePair[] array, int arrayIndex) { throw new NotImplementedException(); } protected virtual IEnumerator> GetEnumeratorFast() @@ -159,7 +161,11 @@ void IDictionary.Add(string key, StringValues value) { ThrowHeadersReadOnlyException(); } - AddValueFast(key, value); + + if (!AddValueFast(key, value)) + { + ThrowDuplicateKeyException(); + } } void ICollection>.Clear() @@ -187,7 +193,10 @@ bool IDictionary.ContainsKey(string key) void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { - CopyToFast(array, arrayIndex); + if (!CopyToFast(array, arrayIndex)) + { + ThrowArgumentException(); + } } IEnumerator IEnumerable.GetEnumerator() diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 299ef0462..0c6e07a36 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -19,11 +19,8 @@ static string If(bool condition, Func formatter) return condition ? formatter() : ""; } - static string AppendSwitch(IEnumerable> values, string className, bool handleUnknown = false) => - $@"fixed (byte* ptr = &keyBytes[keyOffset]) - {{ - var pUB = ptr; - var pUL = (ulong*)pUB; + static string AppendSwitch(IEnumerable> values, string className) => + $@"var pUL = (ulong*)pUB; var pUI = (uint*)pUB; var pUS = (ushort*)pUB; switch (keyLength) @@ -55,19 +52,7 @@ static string AppendSwitch(IEnumerable> values, stri }} ")}}} break; - ")}}} - - {(handleUnknown ? $@" - key = new string('\0', keyLength); - fixed(char *keyBuffer = key) - {{ - if (!AsciiUtilities.TryGetAsciiString(ptr, keyBuffer, keyLength)) - {{ - throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); - }} - }} - ": "")} - }}"; + ")}}}"; class KnownHeader { @@ -80,7 +65,8 @@ class KnownHeader public int BytesCount { get; set; } public bool EnhancedSetter { get; set; } public bool PrimaryHeader { get; set; } - public string TestBit() => $"((_bits & {1L << Index}L) != 0)"; + public string TestBit() => $"(_bits & {1L << Index}L) != 0"; + public string TestNotBit() => $"(_bits & {1L << Index}L) == 0"; public string SetBit() => $"_bits |= {1L << Index}L"; public string ClearBit() => $"_bits &= ~{1L << Index}L"; @@ -318,11 +304,12 @@ public StringValues Header{header.Identifier} {{{(header.Identifier == "ContentLength" ? $@" get {{ + StringValues value; if (ContentLength.HasValue) {{ - return HeaderUtilities.FormatInt64(ContentLength.Value); + value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); }} - return StringValues.Empty; + return value; }} set {{ @@ -330,11 +317,12 @@ public StringValues Header{header.Identifier} }}" : $@" get {{ + StringValues value; if ({header.TestBit()}) {{ - return _headers._{header.Identifier}; + value = _headers._{header.Identifier}; }} - return StringValues.Empty; + return value; }} set {{ @@ -343,7 +331,7 @@ public StringValues Header{header.Identifier} _headers._raw{header.Identifier} = null;")} }}")} }}")} - {Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@" +{Each(loop.Headers.Where(header => header.EnhancedSetter), header => $@" public void SetRaw{header.Identifier}(StringValues value, byte[] raw) {{ {header.SetBit()}; @@ -354,40 +342,7 @@ protected override int GetCountFast() {{ return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); }} - protected override StringValues GetValueFast(string key) - {{ - switch (key.Length) - {{{Each(loop.HeadersByLength, byLength => $@" - case {byLength.Key}: - {{{Each(byLength, header => $@" - if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) - {{{(header.Identifier == "ContentLength" ? @" - if (ContentLength.HasValue) - { - return HeaderUtilities.FormatInt64(ContentLength.Value); - } - else - { - ThrowKeyNotFoundException(); - }" : $@" - if ({header.TestBit()}) - {{ - return _headers._{header.Identifier}; - }} - else - {{ - ThrowKeyNotFoundException(); - }}")} - }} - ")}}} - break;")} - }} - if (MaybeUnknown == null) - {{ - ThrowKeyNotFoundException(); - }} - return MaybeUnknown[key]; - }} + protected override bool TryGetValueFast(string key, out StringValues value) {{ switch (key.Length) @@ -401,31 +356,24 @@ protected override bool TryGetValueFast(string key, out StringValues value) value = HeaderUtilities.FormatInt64(ContentLength.Value); return true; } - else - { - value = StringValues.Empty; - return false; - }" : $@" + return false;" : $@" if ({header.TestBit()}) {{ value = _headers._{header.Identifier}; return true; }} - else - {{ - value = StringValues.Empty; - return false; - }}")} - }} - ")}}} - break; -")}}} - value = StringValues.Empty; + return false;")} + }}")} + }} + break;")} + }} + return MaybeUnknown?.TryGetValue(key, out value) ?? false; }} + protected override void SetValueFast(string key, StringValues value) - {{ - {(loop.ClassName == "FrameResponseHeaders" ? "ValidateHeaderCharacters(value);" : "")} + {{{(loop.ClassName == "FrameResponseHeaders" ? @" + ValidateHeaderCharacters(value);" : "")} switch (key.Length) {{{Each(loop.HeadersByLength, byLength => $@" case {byLength.Key}: @@ -437,45 +385,49 @@ protected override void SetValueFast(string key, StringValues value) _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")}")} return; - }} - ")}}} - break; -")}}} - {(loop.ClassName == "FrameResponseHeaders" ? "ValidateHeaderCharacters(key);" : "")} + }}")} + }} + break;")} + }} + {(loop.ClassName == "FrameResponseHeaders" ? @" + ValidateHeaderCharacters(key);" : "")} Unknown[key] = value; }} - protected override void AddValueFast(string key, StringValues value) - {{ - {(loop.ClassName == "FrameResponseHeaders" ? "ValidateHeaderCharacters(value);" : "")} + + protected override bool AddValueFast(string key, StringValues value) + {{{(loop.ClassName == "FrameResponseHeaders" ? @" + ValidateHeaderCharacters(value);" : "")} switch (key.Length) {{{Each(loop.HeadersByLength, byLength => $@" case {byLength.Key}: {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) {{{(header.Identifier == "ContentLength" ? $@" - if (ContentLength.HasValue) - {{ - ThrowDuplicateKeyException(); - }} - else + if (!ContentLength.HasValue) {{ ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); - }}" : $@" - if ({header.TestBit()}) + return true; + }} + return false;" : $@" + if ({header.TestNotBit()}) {{ - ThrowDuplicateKeyException(); + {header.SetBit()}; + _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" + _headers._raw{header.Identifier} = null;")} + return true; }} - {header.SetBit()}; - _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" - _headers._raw{header.Identifier} = null;")}")} - return; - }} - ")}}} - break; - ")}}} - {(loop.ClassName == "FrameResponseHeaders" ? "ValidateHeaderCharacters(key);" : "")} + return false;")} + }}")} + }} + break;")} + }} +{(loop.ClassName == "FrameResponseHeaders" ? @" + ValidateHeaderCharacters(key);" : "")} Unknown.Add(key, value); + // Return true, above will throw and exit for false + return true; }} + protected override bool RemoveFast(string key) {{ switch (key.Length) @@ -489,32 +441,28 @@ protected override bool RemoveFast(string key) ContentLength = null; return true; } - else - { - return false; - }" : $@" + return false;" : $@" if ({header.TestBit()}) {{ {header.ClearBit()}; - _headers._{header.Identifier} = StringValues.Empty;{(header.EnhancedSetter == false ? "" : $@" + _headers._{header.Identifier} = default(StringValues);{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")} return true; }} - else - {{ - return false; - }}")} - }} - ")}}} - break; - ")}}} + return false;")} + }}")} + }} + break;")} + }} + return MaybeUnknown?.Remove(key) ?? false; }} + protected override void ClearFast() - {{ + {{ MaybeUnknown?.Clear(); ContentLength = null; - if(FrameHeaders.BitCount(_bits) > 11) + if(FrameHeaders.BitCount(_bits) > 12) {{ _headers = default(HeaderReferences); _bits = 0; @@ -533,20 +481,19 @@ protected override void ClearFast() ")} }} - protected override void CopyToFast(KeyValuePair[] array, int arrayIndex) + protected override bool CopyToFast(KeyValuePair[] array, int arrayIndex) {{ if (arrayIndex < 0) {{ - ThrowArgumentException(); + return false; }} {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" if ({header.TestBit()}) {{ if (arrayIndex == array.Length) {{ - ThrowArgumentException(); + return false; }} - array[arrayIndex] = new KeyValuePair(""{header.Name}"", _headers._{header.Identifier}); ++arrayIndex; }}")} @@ -554,13 +501,14 @@ protected override void CopyToFast(KeyValuePair[] array, i {{ if (arrayIndex == array.Length) {{ - ThrowArgumentException(); + return false; }} - array[arrayIndex] = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(ContentLength.Value)); ++arrayIndex; }} ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); + + return true; }} {(loop.ClassName == "FrameResponseHeaders" ? $@" protected void CopyToFast(ref MemoryPoolIterator output) @@ -606,26 +554,43 @@ protected void CopyToFast(ref MemoryPoolIterator output) }} }}")} ")} - }} - - " : "")} + }}" : "")} {(loop.ClassName == "FrameRequestHeaders" ? $@" public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string value) {{ - {AppendSwitch(loop.Headers.Where(h => h.PrimaryHeader).GroupBy(x => x.Name.Length), loop.ClassName)} - - AppendNonPrimaryHeaders(keyBytes, keyOffset, keyLength, value); + fixed (byte* ptr = &keyBytes[keyOffset]) + {{ + var pUB = ptr; + {AppendSwitch(loop.Headers.Where(h => h.PrimaryHeader).GroupBy(x => x.Name.Length), loop.ClassName)} + + AppendNonPrimaryHeaders(ptr, keyOffset, keyLength, value); + }} }} - private unsafe void AppendNonPrimaryHeaders(byte[] keyBytes, int keyOffset, int keyLength, string value) + private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int keyLength, string value) {{ - string key; - {AppendSwitch(loop.Headers.Where(h => !h.PrimaryHeader).GroupBy(x => x.Name.Length), loop.ClassName, true)} + var pUB = pKeyBytes; + {AppendSwitch(loop.Headers.Where(h => !h.PrimaryHeader).GroupBy(x => x.Name.Length), loop.ClassName)} + + AppendUnknownHeaders(pKeyBytes, keyLength, value); + }} + + private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string value) + {{ + string key = new string('\0', keyLength); + fixed (char* keyBuffer = key) + {{ + if (!AsciiUtilities.TryGetAsciiString(pKeyBytes, keyBuffer, keyLength)) + {{ + throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); + }} + }} StringValues existing; Unknown.TryGetValue(key, out existing); Unknown[key] = AppendValue(existing, value); }}" : "")} + private struct HeaderReferences {{{Each(loop.Headers.Where(header => header.Index >= 0), header => @" public StringValues _" + header.Identifier + ";")} From 55515dda64c34dd67738d09f2a4a4a2e3b9db2da Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 21 Jan 2017 21:43:40 +0000 Subject: [PATCH 08/18] Headers Cleanup --- .../Internal/Http/FrameHeaders.Generated.cs | 81 +++++++++---------- .../Internal/Http/FrameHeaders.cs | 25 +----- .../Internal/Http/FrameRequestHeaders.cs | 19 +++++ .../Internal/Http/FrameResponseHeaders.cs | 21 +++++ .../KnownHeaders.cs | 45 +++++------ 5 files changed, 103 insertions(+), 88 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index c81ad7951..eb8c6d20b 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -752,21 +752,21 @@ public StringValues HeaderContentLength get { StringValues value; - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); + value = new StringValues(HeaderUtilities.FormatInt64(_contentLength.Value)); } return value; } set { - ContentLength = ParseRequestContentLength(value); + _contentLength = ParseContentLength(value); } } protected override int GetCountFast() { - return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (_contentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } protected override bool TryGetValueFast(string key, out StringValues value) @@ -1118,9 +1118,9 @@ protected override bool TryGetValueFast(string key, out StringValues value) } if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - value = HeaderUtilities.FormatInt64(ContentLength.Value); + value = HeaderUtilities.FormatInt64(_contentLength.Value); return true; } return false; @@ -1500,7 +1500,7 @@ protected override void SetValueFast(string key, StringValues value) } if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - ContentLength = ParseRequestContentLength(value); + _contentLength = ParseContentLength(value.ToString()); return; } } @@ -1594,8 +1594,8 @@ protected override void SetValueFast(string key, StringValues value) } break; } - - Unknown[key] = value; + + SetValueUnknown(key, value); } protected override bool AddValueFast(string key, StringValues value) @@ -1980,9 +1980,9 @@ protected override bool AddValueFast(string key, StringValues value) } if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (!ContentLength.HasValue) + if (!_contentLength.HasValue) { - ContentLength = ParseRequestContentLength(value); + _contentLength = ParseContentLength(value); return true; } return false; @@ -2506,9 +2506,9 @@ protected override bool RemoveFast(string key) } if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - ContentLength = null; + _contentLength = null; return true; } return false; @@ -2651,7 +2651,7 @@ protected override bool RemoveFast(string key) protected override void ClearFast() { MaybeUnknown?.Clear(); - ContentLength = null; + _contentLength = null; if(FrameHeaders.BitCount(_bits) > 12) { _headers = default(HeaderReferences); @@ -3485,13 +3485,13 @@ protected override bool CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Access-Control-Request-Headers", _headers._AccessControlRequestHeaders); ++arrayIndex; } - if (ContentLength.HasValue) + if (_contentLength.HasValue) { if (arrayIndex == array.Length) { return false; } - array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); + array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_contentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -4045,13 +4045,13 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int if ((((pUL[0] & 18437701552104792031uL) == 3266321689424580419uL) && ((pUI[2] & 3755991007u) == 1196311884u) && ((pUS[6] & 57311u) == 18516u))) { - if (ContentLength.HasValue) + if (_contentLength.HasValue) { ThrowRequestMultipleContentLengths(); } else { - ContentLength = ParseRequestContentLength(value); + _contentLength = ParseContentLength(value); } return; } @@ -4781,9 +4781,9 @@ public bool MoveNext() } state44: - if (_collection.ContentLength.HasValue) + if (_collection._contentLength.HasValue) { - _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); + _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection._contentLength.Value)); _state = 45; return true; } @@ -5413,15 +5413,15 @@ public StringValues HeaderContentLength get { StringValues value; - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); + value = new StringValues(HeaderUtilities.FormatInt64(_contentLength.Value)); } return value; } set { - ContentLength = ParseResponseContentLength(value); + _contentLength = ParseContentLength(value); } } @@ -5451,7 +5451,7 @@ public void SetRawServer(StringValues value, byte[] raw) } protected override int GetCountFast() { - return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (_contentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); } protected override bool TryGetValueFast(string key, out StringValues value) @@ -5849,9 +5849,9 @@ protected override bool TryGetValueFast(string key, out StringValues value) { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - value = HeaderUtilities.FormatInt64(ContentLength.Value); + value = HeaderUtilities.FormatInt64(_contentLength.Value); return true; } return false; @@ -6158,15 +6158,14 @@ protected override void SetValueFast(string key, StringValues value) { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - ContentLength = ParseResponseContentLength(value); + _contentLength = ParseContentLength(value.ToString()); return; } } break; } - - ValidateHeaderCharacters(key); - Unknown[key] = value; + + SetValueUnknown(key, value); } protected override bool AddValueFast(string key, StringValues value) @@ -6604,9 +6603,9 @@ protected override bool AddValueFast(string key, StringValues value) { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (!ContentLength.HasValue) + if (!_contentLength.HasValue) { - ContentLength = ParseResponseContentLength(value); + _contentLength = ParseContentLength(value); return true; } return false; @@ -7055,9 +7054,9 @@ protected override bool RemoveFast(string key) { if ("Content-Length".Equals(key, StringComparison.OrdinalIgnoreCase)) { - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - ContentLength = null; + _contentLength = null; return true; } return false; @@ -7072,7 +7071,7 @@ protected override bool RemoveFast(string key) protected override void ClearFast() { MaybeUnknown?.Clear(); - ContentLength = null; + _contentLength = null; if(FrameHeaders.BitCount(_bits) > 12) { _headers = default(HeaderReferences); @@ -7754,13 +7753,13 @@ protected override bool CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair("Access-Control-Max-Age", _headers._AccessControlMaxAge); ++arrayIndex; } - if (ContentLength.HasValue) + if (_contentLength.HasValue) { if (arrayIndex == array.Length) { return false; } - array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(ContentLength.Value)); + array[arrayIndex] = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_contentLength.Value)); ++arrayIndex; } ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -7770,7 +7769,7 @@ protected override bool CopyToFast(KeyValuePair[] array, i protected void CopyToFast(ref MemoryPoolIterator output) { - var tempBits = _bits | (ContentLength.HasValue ? -9223372036854775808L : 0); + var tempBits = _bits | (_contentLength.HasValue ? -9223372036854775808L : 0); if ((_bits & 2L) != 0) @@ -7880,7 +7879,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) } - if (ContentLength.HasValue) + if (_contentLength.HasValue) { output.CopyFrom(_headerBytes, 592, 18); output.CopyFromNumeric((ulong)ContentLength.Value); @@ -9056,9 +9055,9 @@ public bool MoveNext() } state36: - if (_collection.ContentLength.HasValue) + if (_collection._contentLength.HasValue) { - _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); + _current = new KeyValuePair("Content-Length", HeaderUtilities.FormatInt64(_collection._contentLength.Value)); _state = 37; return true; } diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index 1cedf3197..a1e4461fa 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -7,13 +7,12 @@ using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { public abstract class FrameHeaders : IHeaderDictionary { - private long? _contentLength; + protected long? _contentLength; protected bool _isReadOnly; protected Dictionary MaybeUnknown; protected Dictionary Unknown => MaybeUnknown ?? (MaybeUnknown = new Dictionary(StringComparer.OrdinalIgnoreCase)); @@ -256,28 +255,6 @@ public static void ValidateHeaderCharacters(string headerCharacters) } } - public static long ParseRequestContentLength(string value) - { - long parsed; - if (!HeaderUtilities.TryParseInt64(value, out parsed)) - { - ThrowInvalidRequestContentLengthException(value); - } - - return parsed; - } - - public static long ParseResponseContentLength(string value) - { - long parsed; - if (!HeaderUtilities.TryParseInt64(value, out parsed)) - { - ThrowInvalidResponseContentLengthException(value); - } - - return parsed; - } - public static unsafe ConnectionOptions ParseConnection(StringValues connection) { var connectionOptions = ConnectionOptions.None; diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs index 7d24bf3d8..99b7ed327 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs @@ -3,12 +3,31 @@ using System.Collections; using System.Collections.Generic; +using System.Runtime.CompilerServices; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { public partial class FrameRequestHeaders : FrameHeaders { + private static long ParseContentLength(string value) + { + long parsed; + if (!HeaderUtilities.TryParseInt64(value, out parsed)) + { + ThrowInvalidRequestContentLengthException(value); + } + + return parsed; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void SetValueUnknown(string key, StringValues value) + { + Unknown[key] = value; + } + public Enumerator GetEnumerator() { return new Enumerator(this); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs index e711ef6f2..bb45a2592 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs @@ -3,8 +3,10 @@ using System.Collections; using System.Collections.Generic; +using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Primitives; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.Kestrel.Internal.Http { @@ -52,6 +54,24 @@ public void CopyTo(ref MemoryPoolIterator output) } } + private static long ParseContentLength(string value) + { + long parsed; + if (!HeaderUtilities.TryParseInt64(value, out parsed)) + { + ThrowInvalidResponseContentLengthException(value); + } + + return parsed; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void SetValueUnknown(string key, StringValues value) + { + ValidateHeaderCharacters(key); + Unknown[key] = value; + } + public partial struct Enumerator : IEnumerator> { private readonly FrameResponseHeaders _collection; @@ -86,5 +106,6 @@ public void Reset() _state = 0; } } + } } diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 0c6e07a36..60b8a2dac 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -29,13 +29,13 @@ static string AppendSwitch(IEnumerable> values, stri {{{Each(byLength, header => $@" if ({header.EqualIgnoreCaseBytes()}) {{{(header.Identifier == "ContentLength" ? $@" - if (ContentLength.HasValue) + if (_contentLength.HasValue) {{ ThrowRequestMultipleContentLengths(); }} else {{ - ContentLength = ParseRequestContentLength(value); + _contentLength = ParseContentLength(value); }} return;" : $@" if ({header.TestBit()}) @@ -305,15 +305,15 @@ public StringValues Header{header.Identifier} get {{ StringValues value; - if (ContentLength.HasValue) + if (_contentLength.HasValue) {{ - value = new StringValues(HeaderUtilities.FormatInt64(ContentLength.Value)); + value = new StringValues(HeaderUtilities.FormatInt64(_contentLength.Value)); }} return value; }} set {{ - ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + _contentLength = ParseContentLength(value); }}" : $@" get {{ @@ -340,7 +340,7 @@ public StringValues Header{header.Identifier} }}")} protected override int GetCountFast() {{ - return (ContentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); + return (_contentLength.HasValue ? 1 : 0 ) + BitCount(_bits) + (MaybeUnknown?.Count ?? 0); }} protected override bool TryGetValueFast(string key, out StringValues value) @@ -351,9 +351,9 @@ protected override bool TryGetValueFast(string key, out StringValues value) {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) {{{(header.Identifier == "ContentLength" ? @" - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - value = HeaderUtilities.FormatInt64(ContentLength.Value); + value = HeaderUtilities.FormatInt64(_contentLength.Value); return true; } return false;" : $@" @@ -380,7 +380,7 @@ protected override void SetValueFast(string key, StringValues value) {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) {{{(header.Identifier == "ContentLength" ? $@" - ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value);" : $@" + _contentLength = ParseContentLength(value.ToString());" : $@" {header.SetBit()}; _headers._{header.Identifier} = value;{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")}")} @@ -389,9 +389,8 @@ protected override void SetValueFast(string key, StringValues value) }} break;")} }} - {(loop.ClassName == "FrameResponseHeaders" ? @" - ValidateHeaderCharacters(key);" : "")} - Unknown[key] = value; + + SetValueUnknown(key, value); }} protected override bool AddValueFast(string key, StringValues value) @@ -403,9 +402,9 @@ protected override bool AddValueFast(string key, StringValues value) {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) {{{(header.Identifier == "ContentLength" ? $@" - if (!ContentLength.HasValue) + if (!_contentLength.HasValue) {{ - ContentLength = Parse{(loop.ClassName == "FrameResponseHeaders" ? "Response" : "Request")}ContentLength(value); + _contentLength = ParseContentLength(value); return true; }} return false;" : $@" @@ -436,9 +435,9 @@ protected override bool RemoveFast(string key) {{{Each(byLength, header => $@" if (""{header.Name}"".Equals(key, StringComparison.OrdinalIgnoreCase)) {{{(header.Identifier == "ContentLength" ? @" - if (ContentLength.HasValue) + if (_contentLength.HasValue) { - ContentLength = null; + _contentLength = null; return true; } return false;" : $@" @@ -461,7 +460,7 @@ protected override bool RemoveFast(string key) protected override void ClearFast() {{ MaybeUnknown?.Clear(); - ContentLength = null; + _contentLength = null; if(FrameHeaders.BitCount(_bits) > 12) {{ _headers = default(HeaderReferences); @@ -497,13 +496,13 @@ protected override bool CopyToFast(KeyValuePair[] array, i array[arrayIndex] = new KeyValuePair(""{header.Name}"", _headers._{header.Identifier}); ++arrayIndex; }}")} - if (ContentLength.HasValue) + if (_contentLength.HasValue) {{ if (arrayIndex == array.Length) {{ return false; }} - array[arrayIndex] = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(ContentLength.Value)); + array[arrayIndex] = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(_contentLength.Value)); ++arrayIndex; }} ((ICollection>)MaybeUnknown)?.CopyTo(array, arrayIndex); @@ -513,10 +512,10 @@ protected override bool CopyToFast(KeyValuePair[] array, i {(loop.ClassName == "FrameResponseHeaders" ? $@" protected void CopyToFast(ref MemoryPoolIterator output) {{ - var tempBits = _bits | (ContentLength.HasValue ? {1L << 63}L : 0); + var tempBits = _bits | (_contentLength.HasValue ? {1L << 63}L : 0); {Each(loop.Headers.OrderBy(h => !h.PrimaryHeader), header => $@" {(header.Identifier == "ContentLength" ? $@" - if (ContentLength.HasValue) + if (_contentLength.HasValue) {{ output.CopyFrom(_headerBytes, {header.BytesOffset}, {header.BytesCount}); output.CopyFromNumeric((ulong)ContentLength.Value); @@ -623,9 +622,9 @@ public bool MoveNext() }} ")} state{loop.Headers.Count()}: - if (_collection.ContentLength.HasValue) + if (_collection._contentLength.HasValue) {{ - _current = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(_collection.ContentLength.Value)); + _current = new KeyValuePair(""Content-Length"", HeaderUtilities.FormatInt64(_collection._contentLength.Value)); _state = {loop.Headers.Count() + 1}; return true; }} From e330a9c01c2f21ffb7113713f85e4a9105243e91 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 21 Jan 2017 22:03:33 +0000 Subject: [PATCH 09/18] Cut Append/AppendNonPrimaryHeaders zeroed stack Append() before 80 bytes, after 64 bytes zeroed AppendNonPrimaryHeaders() before 888 bytes, after 48 bytes zeroed --- .../Internal/Http/FrameHeaders.Generated.cs | 104 ++++++++---------- .../Internal/Http/FrameHeaders.cs | 2 + .../Internal/Http/FrameRequestHeaders.cs | 18 +++ .../KnownHeaders.cs | 19 +--- 4 files changed, 67 insertions(+), 76 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index eb8c6d20b..59db89234 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -3508,6 +3508,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string var pUL = (ulong*)pUB; var pUI = (uint*)pUB; var pUS = (ushort*)pUB; + var stringValue = new StringValues(value); switch (keyLength) { case 6: @@ -3521,7 +3522,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string else { _bits |= 524288L; - _headers._Accept = new StringValues(value); + _headers._Accept = stringValue; } return; } @@ -3539,7 +3540,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string else { _bits |= 134217728L; - _headers._Host = new StringValues(value); + _headers._Host = stringValue; } return; } @@ -3557,7 +3558,7 @@ public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string else { _bits |= 549755813888L; - _headers._UserAgent = new StringValues(value); + _headers._UserAgent = stringValue; } return; } @@ -3575,6 +3576,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int var pUL = (ulong*)pUB; var pUI = (uint*)pUB; var pUS = (ushort*)pUB; + var stringValue = new StringValues(value); switch (keyLength) { case 13: @@ -3588,7 +3590,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 1L; - _headers._CacheControl = new StringValues(value); + _headers._CacheControl = stringValue; } return; } @@ -3602,7 +3604,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 65536L; - _headers._ContentRange = new StringValues(value); + _headers._ContentRange = stringValue; } return; } @@ -3616,7 +3618,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 262144L; - _headers._LastModified = new StringValues(value); + _headers._LastModified = stringValue; } return; } @@ -3630,7 +3632,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 8388608L; - _headers._Authorization = new StringValues(value); + _headers._Authorization = stringValue; } return; } @@ -3644,7 +3646,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 1073741824L; - _headers._IfNoneMatch = new StringValues(value); + _headers._IfNoneMatch = stringValue; } return; } @@ -3662,7 +3664,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 2L; - _headers._Connection = new StringValues(value); + _headers._Connection = stringValue; } return; } @@ -3676,7 +3678,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 8L; - _headers._KeepAlive = new StringValues(value); + _headers._KeepAlive = stringValue; } return; } @@ -3694,7 +3696,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 4L; - _headers._Date = new StringValues(value); + _headers._Date = stringValue; } return; } @@ -3708,7 +3710,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 67108864L; - _headers._From = new StringValues(value); + _headers._From = stringValue; } return; } @@ -3726,7 +3728,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 16L; - _headers._Pragma = new StringValues(value); + _headers._Pragma = stringValue; } return; } @@ -3740,7 +3742,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 16777216L; - _headers._Cookie = new StringValues(value); + _headers._Cookie = stringValue; } return; } @@ -3754,7 +3756,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 33554432L; - _headers._Expect = new StringValues(value); + _headers._Expect = stringValue; } return; } @@ -3768,7 +3770,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 1099511627776L; - _headers._Origin = new StringValues(value); + _headers._Origin = stringValue; } return; } @@ -3786,7 +3788,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 32L; - _headers._Trailer = new StringValues(value); + _headers._Trailer = stringValue; } return; } @@ -3800,7 +3802,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 128L; - _headers._Upgrade = new StringValues(value); + _headers._Upgrade = stringValue; } return; } @@ -3814,7 +3816,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 512L; - _headers._Warning = new StringValues(value); + _headers._Warning = stringValue; } return; } @@ -3828,7 +3830,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 131072L; - _headers._Expires = new StringValues(value); + _headers._Expires = stringValue; } return; } @@ -3842,7 +3844,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 34359738368L; - _headers._Referer = new StringValues(value); + _headers._Referer = stringValue; } return; } @@ -3860,7 +3862,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 64L; - _headers._TransferEncoding = new StringValues(value); + _headers._TransferEncoding = stringValue; } return; } @@ -3874,7 +3876,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 536870912L; - _headers._IfModifiedSince = new StringValues(value); + _headers._IfModifiedSince = stringValue; } return; } @@ -3892,7 +3894,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 256L; - _headers._Via = new StringValues(value); + _headers._Via = stringValue; } return; } @@ -3910,7 +3912,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 1024L; - _headers._Allow = new StringValues(value); + _headers._Allow = stringValue; } return; } @@ -3924,7 +3926,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 68719476736L; - _headers._Range = new StringValues(value); + _headers._Range = stringValue; } return; } @@ -3942,7 +3944,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 2048L; - _headers._ContentType = new StringValues(value); + _headers._ContentType = stringValue; } return; } @@ -3956,7 +3958,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 8589934592L; - _headers._MaxForwards = new StringValues(value); + _headers._MaxForwards = stringValue; } return; } @@ -3974,7 +3976,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 4096L; - _headers._ContentEncoding = new StringValues(value); + _headers._ContentEncoding = stringValue; } return; } @@ -3988,7 +3990,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 8192L; - _headers._ContentLanguage = new StringValues(value); + _headers._ContentLanguage = stringValue; } return; } @@ -4002,7 +4004,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 16384L; - _headers._ContentLocation = new StringValues(value); + _headers._ContentLocation = stringValue; } return; } @@ -4020,7 +4022,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 32768L; - _headers._ContentMD5 = new StringValues(value); + _headers._ContentMD5 = stringValue; } return; } @@ -4038,7 +4040,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 1048576L; - _headers._AcceptCharset = new StringValues(value); + _headers._AcceptCharset = stringValue; } return; } @@ -4069,7 +4071,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 2097152L; - _headers._AcceptEncoding = new StringValues(value); + _headers._AcceptEncoding = stringValue; } return; } @@ -4083,7 +4085,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 4194304L; - _headers._AcceptLanguage = new StringValues(value); + _headers._AcceptLanguage = stringValue; } return; } @@ -4101,7 +4103,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 268435456L; - _headers._IfMatch = new StringValues(value); + _headers._IfMatch = stringValue; } return; } @@ -4115,7 +4117,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 2147483648L; - _headers._IfRange = new StringValues(value); + _headers._IfRange = stringValue; } return; } @@ -4133,7 +4135,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 4294967296L; - _headers._IfUnmodifiedSince = new StringValues(value); + _headers._IfUnmodifiedSince = stringValue; } return; } @@ -4147,7 +4149,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 17179869184L; - _headers._ProxyAuthorization = new StringValues(value); + _headers._ProxyAuthorization = stringValue; } return; } @@ -4165,7 +4167,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 137438953472L; - _headers._TE = new StringValues(value); + _headers._TE = stringValue; } return; } @@ -4183,7 +4185,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 274877906944L; - _headers._Translate = new StringValues(value); + _headers._Translate = stringValue; } return; } @@ -4201,7 +4203,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 2199023255552L; - _headers._AccessControlRequestMethod = new StringValues(value); + _headers._AccessControlRequestMethod = stringValue; } return; } @@ -4219,7 +4221,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int else { _bits |= 4398046511104L; - _headers._AccessControlRequestHeaders = new StringValues(value); + _headers._AccessControlRequestHeaders = stringValue; } return; } @@ -4230,22 +4232,6 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int AppendUnknownHeaders(pKeyBytes, keyLength, value); } - private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string value) - { - string key = new string('\0', keyLength); - fixed (char* keyBuffer = key) - { - if (!AsciiUtilities.TryGetAsciiString(pKeyBytes, keyBuffer, keyLength)) - { - throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); - } - } - - StringValues existing; - Unknown.TryGetValue(key, out existing); - Unknown[key] = AppendValue(existing, value); - } - private struct HeaderReferences { public StringValues _CacheControl; diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index a1e4461fa..91a42d890 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; @@ -104,6 +105,7 @@ public void Reset() ClearFast(); } + [MethodImpl(MethodImplOptions.NoInlining)] protected static StringValues AppendValue(StringValues existing, string append) { return StringValues.Concat(existing, append); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs index 99b7ed327..d21ee1a3a 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; +using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; @@ -28,6 +29,23 @@ private void SetValueUnknown(string key, StringValues value) Unknown[key] = value; } + [MethodImpl(MethodImplOptions.NoInlining)] + private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string value) + { + string key = new string('\0', keyLength); + fixed (char* keyBuffer = key) + { + if (!AsciiUtilities.TryGetAsciiString(pKeyBytes, keyBuffer, keyLength)) + { + throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); + } + } + + StringValues existing; + Unknown.TryGetValue(key, out existing); + Unknown[key] = AppendValue(existing, value); + } + public Enumerator GetEnumerator() { return new Enumerator(this); diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 60b8a2dac..82cd82f10 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -23,6 +23,7 @@ static string AppendSwitch(IEnumerable> values, stri $@"var pUL = (ulong*)pUB; var pUI = (uint*)pUB; var pUS = (ushort*)pUB; + var stringValue = new StringValues(value); switch (keyLength) {{{Each(values, byLength => $@" case {byLength.Key}: @@ -45,7 +46,7 @@ static string AppendSwitch(IEnumerable> values, stri else {{ {header.SetBit()}; - _headers._{header.Identifier} = new StringValues(value);{(header.EnhancedSetter == false ? "" : $@" + _headers._{header.Identifier} = stringValue;{(header.EnhancedSetter == false ? "" : $@" _headers._raw{header.Identifier} = null;")} }} return;")} @@ -572,22 +573,6 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int {AppendSwitch(loop.Headers.Where(h => !h.PrimaryHeader).GroupBy(x => x.Name.Length), loop.ClassName)} AppendUnknownHeaders(pKeyBytes, keyLength, value); - }} - - private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string value) - {{ - string key = new string('\0', keyLength); - fixed (char* keyBuffer = key) - {{ - if (!AsciiUtilities.TryGetAsciiString(pKeyBytes, keyBuffer, keyLength)) - {{ - throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidCharactersInHeaderName); - }} - }} - - StringValues existing; - Unknown.TryGetValue(key, out existing); - Unknown[key] = AppendValue(existing, value); }}" : "")} private struct HeaderReferences From 99c90126f7c1479db62acfebde139b51dbd00056 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 22 Jan 2017 00:21:48 +0000 Subject: [PATCH 10/18] Stop benchmarks crashing --- .../columns/RpsColumn.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/columns/RpsColumn.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/columns/RpsColumn.cs index 12e9969ed..9727e7110 100644 --- a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/columns/RpsColumn.cs +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/columns/RpsColumn.cs @@ -15,7 +15,7 @@ public class RpsColumn : IColumn public string GetValue(Summary summary, Benchmark benchmark) { - var totalNanos = summary.Reports.First(r => r.Benchmark == benchmark).ResultStatistics.Mean; + var totalNanos = summary.Reports.First(r => r.Benchmark == benchmark)?.ResultStatistics?.Mean ?? 0; // Make sure we don't divide by zero!! return Math.Abs(totalNanos) > 0.0 ? (NanosPerSecond / totalNanos).ToString("N2") : "N/A"; } From 04229be0087161b0e1264c9ef7fcb84c4dda000c Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 23 Jan 2017 04:35:42 +0000 Subject: [PATCH 11/18] Fast ulong output --- .../Infrastructure/MemoryPoolIterator.cs | 75 ++++++++++++++++- .../FrameResponseHeadersTests.cs | 82 +++++++++++++++++++ 2 files changed, 155 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs index 4a9a37137..c5f663cb7 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs @@ -1096,15 +1096,86 @@ private static byte[] CreateNumericBytesScratch() return bytes; } - public void CopyFromNumeric(ulong value) + public unsafe void CopyFromNumeric(ulong value) { + const byte AsciiDigitStart = (byte)'0'; + + var block = _block; + if (block == null) + { + return; + } + + var blockIndex = _index; + var bytesLeftInBlock = block.Data.Offset + block.Data.Count - blockIndex; + var start = block.DataFixedPtr + blockIndex; + + if (value < 10) + { + if (bytesLeftInBlock < 1) + { + goto overflow; + } + _index = blockIndex + 1; + block.End = blockIndex + 1; + + *(start) = (byte)(((uint)value) + AsciiDigitStart); + } + else if (value < 100) + { + if (bytesLeftInBlock < 2) + { + goto overflow; + } + _index = blockIndex + 2; + block.End = blockIndex + 2; + + var val = (uint)value; + var tens = (byte)((val * 205u) >> 11); // div10, valid to 1028 + + *(start) = (byte)(tens + AsciiDigitStart); + *(start + 1) = (byte)(val - (tens * 10) + AsciiDigitStart); + } + else if (value < 1000) + { + if (bytesLeftInBlock < 3) + { + goto overflow; + } + _index = blockIndex + 3; + block.End = blockIndex + 3; + + var val = (uint)value; + var digit0 = (byte)((val * 41u) >> 12); // div100, valid to 1098 + var digits01 = (byte)((val * 205u) >> 11); // div10, valid to 1028 + + *(start) = (byte)(digit0 + AsciiDigitStart); + *(start + 1) = (byte)(digits01 - (digit0 * 10) + AsciiDigitStart); + *(start + 2) = (byte)(val - (digits01 * 10) + AsciiDigitStart); + } + else + { + goto overflow; + } + + return; + + overflow: + CopyFromNumericOverflow(value); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private unsafe void CopyFromNumericOverflow(ulong value) + { + const byte AsciiDigitStart = (byte)'0'; + var position = _maxULongByteLength; var byteBuffer = NumericBytesScratch; do { // Consider using Math.DivRem() if available var quotient = value / 10; - byteBuffer[--position] = (byte)(0x30 + (value - quotient * 10)); // 0x30 = '0' + byteBuffer[--position] = (byte)(AsciiDigitStart + (value - quotient * 10)); // 0x30 = '0' value = quotient; } while (value != 0); diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs index 7d4c16ac2..4f8ffb52d 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs @@ -10,8 +10,10 @@ using Microsoft.AspNetCore.Server.Kestrel; using Microsoft.AspNetCore.Server.Kestrel.Internal; using Microsoft.AspNetCore.Server.Kestrel.Internal.Http; +using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; using Microsoft.Extensions.Primitives; using Xunit; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Server.KestrelTests { @@ -151,6 +153,86 @@ public void ThrowsWhenClearingHeadersAfterReadOnlyIsSet() Assert.Throws(() => dictionary.Clear()); } + [Fact] + public void CorrectContentLengthsOutput() + { + using(var pool = new MemoryPool()) + { + var block = pool.Lease(); + try + { + for (var i = 0u; i <= 9u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)(i + '0')); + Assert.Equal(block.End, block.Start + 1); + Assert.Equal(iter.Index, block.End); + } + for (var i = 10u; i <= 99u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 10) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 2); + Assert.Equal(iter.Index, block.End); + } + for (var i = 100u; i <= 999u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 100) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 100) / 10) + '0')); + Assert.Equal(block.Array[block.Start + 2], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 3); + Assert.Equal(iter.Index, block.End); + } + for (var i = 1000u; i <= 9999u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 1000) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 1000) / 100) + '0')); + Assert.Equal(block.Array[block.Start + 2], (byte)(((i % 100) / 10) + '0')); + Assert.Equal(block.Array[block.Start + 3], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 4); + Assert.Equal(iter.Index, block.End); + } + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(ulong.MaxValue); + + var outputBytes = Encoding.ASCII.GetBytes(ulong.MaxValue.ToString("0")); + + for (var i = 0; i < outputBytes.Length; i++) + { + Assert.Equal(block.Array[block.Start + i], outputBytes[i]); + } + + Assert.Equal(block.End, block.Start + outputBytes.Length); + Assert.Equal(iter.Index, block.End); + } + } + finally + { + pool.Return(block); + } + } + } + [Theory] [MemberData(nameof(BadContentLengths))] public void ThrowsWhenAddingContentLengthWithNonNumericValue(string contentLength) From 4b57d2cd37da1e59e1048c40518e0da675ae3342 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 23 Jan 2017 06:05:35 +0000 Subject: [PATCH 12/18] Cleanup KnownHeaders --- .../Internal/Http/FrameHeaders.Generated.cs | 144 +++++------------- .../KnownHeaders.cs | 45 +++--- 2 files changed, 56 insertions(+), 133 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index 59db89234..b8c89bc37 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -7757,8 +7757,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) { var tempBits = _bits | (_contentLength.HasValue ? -9223372036854775808L : 0); - - if ((_bits & 2L) != 0) + if ((tempBits & 2L) != 0) { if (_headers._rawConnection != null) { @@ -7784,9 +7783,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 4L) != 0) + if ((tempBits & 4L) != 0) { if (_headers._rawDate != null) { @@ -7812,9 +7809,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 2048L) != 0) + if ((tempBits & 2048L) != 0) { { var valueCount = _headers._ContentType.Count; @@ -7835,9 +7830,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 33554432L) != 0) + if ((tempBits & 33554432L) != 0) { if (_headers._rawServer != null) { @@ -7863,9 +7856,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if (_contentLength.HasValue) + if ((tempBits & -9223372036854775808L) != 0) { output.CopyFrom(_headerBytes, 592, 18); output.CopyFromNumeric((ulong)ContentLength.Value); @@ -7876,9 +7867,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 1L) != 0) + if ((tempBits & 1L) != 0) { { var valueCount = _headers._CacheControl.Count; @@ -7899,9 +7888,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 8L) != 0) + if ((tempBits & 8L) != 0) { { var valueCount = _headers._KeepAlive.Count; @@ -7922,9 +7909,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 16L) != 0) + if ((tempBits & 16L) != 0) { { var valueCount = _headers._Pragma.Count; @@ -7945,9 +7930,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 32L) != 0) + if ((tempBits & 32L) != 0) { { var valueCount = _headers._Trailer.Count; @@ -7968,9 +7951,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 64L) != 0) + if ((tempBits & 64L) != 0) { if (_headers._rawTransferEncoding != null) { @@ -7996,9 +7977,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 128L) != 0) + if ((tempBits & 128L) != 0) { { var valueCount = _headers._Upgrade.Count; @@ -8019,9 +7998,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 256L) != 0) + if ((tempBits & 256L) != 0) { { var valueCount = _headers._Via.Count; @@ -8042,9 +8019,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 512L) != 0) + if ((tempBits & 512L) != 0) { { var valueCount = _headers._Warning.Count; @@ -8065,9 +8040,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 1024L) != 0) + if ((tempBits & 1024L) != 0) { { var valueCount = _headers._Allow.Count; @@ -8088,9 +8061,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 4096L) != 0) + if ((tempBits & 4096L) != 0) { { var valueCount = _headers._ContentEncoding.Count; @@ -8111,9 +8082,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 8192L) != 0) + if ((tempBits & 8192L) != 0) { { var valueCount = _headers._ContentLanguage.Count; @@ -8134,9 +8103,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 16384L) != 0) + if ((tempBits & 16384L) != 0) { { var valueCount = _headers._ContentLocation.Count; @@ -8157,9 +8124,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 32768L) != 0) + if ((tempBits & 32768L) != 0) { { var valueCount = _headers._ContentMD5.Count; @@ -8180,9 +8145,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 65536L) != 0) + if ((tempBits & 65536L) != 0) { { var valueCount = _headers._ContentRange.Count; @@ -8203,9 +8166,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 131072L) != 0) + if ((tempBits & 131072L) != 0) { { var valueCount = _headers._Expires.Count; @@ -8226,9 +8187,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 262144L) != 0) + if ((tempBits & 262144L) != 0) { { var valueCount = _headers._LastModified.Count; @@ -8249,9 +8208,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 524288L) != 0) + if ((tempBits & 524288L) != 0) { { var valueCount = _headers._AcceptRanges.Count; @@ -8272,9 +8229,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 1048576L) != 0) + if ((tempBits & 1048576L) != 0) { { var valueCount = _headers._Age.Count; @@ -8295,9 +8250,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 2097152L) != 0) + if ((tempBits & 2097152L) != 0) { { var valueCount = _headers._ETag.Count; @@ -8318,9 +8271,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 4194304L) != 0) + if ((tempBits & 4194304L) != 0) { { var valueCount = _headers._Location.Count; @@ -8341,9 +8292,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 8388608L) != 0) + if ((tempBits & 8388608L) != 0) { { var valueCount = _headers._ProxyAuthenticate.Count; @@ -8364,9 +8313,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 16777216L) != 0) + if ((tempBits & 16777216L) != 0) { { var valueCount = _headers._RetryAfter.Count; @@ -8387,9 +8334,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 67108864L) != 0) + if ((tempBits & 67108864L) != 0) { { var valueCount = _headers._SetCookie.Count; @@ -8410,9 +8355,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 134217728L) != 0) + if ((tempBits & 134217728L) != 0) { { var valueCount = _headers._Vary.Count; @@ -8433,9 +8376,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 268435456L) != 0) + if ((tempBits & 268435456L) != 0) { { var valueCount = _headers._WWWAuthenticate.Count; @@ -8456,9 +8397,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 536870912L) != 0) + if ((tempBits & 536870912L) != 0) { { var valueCount = _headers._AccessControlAllowCredentials.Count; @@ -8479,9 +8418,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 1073741824L) != 0) + if ((tempBits & 1073741824L) != 0) { { var valueCount = _headers._AccessControlAllowHeaders.Count; @@ -8502,9 +8439,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 2147483648L) != 0) + if ((tempBits & 2147483648L) != 0) { { var valueCount = _headers._AccessControlAllowMethods.Count; @@ -8525,9 +8460,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 4294967296L) != 0) + if ((tempBits & 4294967296L) != 0) { { var valueCount = _headers._AccessControlAllowOrigin.Count; @@ -8548,9 +8481,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 8589934592L) != 0) + if ((tempBits & 8589934592L) != 0) { { var valueCount = _headers._AccessControlExposeHeaders.Count; @@ -8571,9 +8502,7 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - - - if ((_bits & 17179869184L) != 0) + if ((tempBits & 17179869184L) != 0) { { var valueCount = _headers._AccessControlMaxAge.Count; @@ -8594,7 +8523,6 @@ protected void CopyToFast(ref MemoryPoolIterator output) return; } } - } diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 82cd82f10..e4f550493 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -67,6 +67,7 @@ class KnownHeader public bool EnhancedSetter { get; set; } public bool PrimaryHeader { get; set; } public string TestBit() => $"(_bits & {1L << Index}L) != 0"; + public string TestTempBit() => $"(tempBits & {1L << Index}L) != 0"; public string TestNotBit() => $"(_bits & {1L << Index}L) == 0"; public string SetBit() => $"_bits |= {1L << Index}L"; public string ClearBit() => $"_bits &= ~{1L << Index}L"; @@ -130,7 +131,6 @@ public static string GeneratedFile() { "Connection", "Date", - "Content-Length", "Content-Type", "Server", }; @@ -147,7 +147,6 @@ public static string GeneratedFile() "Via", "Warning", "Allow", - "Content-Length", "Content-Type", "Content-Encoding", "Content-Language", @@ -189,7 +188,6 @@ public static string GeneratedFile() "User-Agent", }) .Concat(corsRequestHeaders) - .Where((header) => header != "Content-Length") .Select((header, index) => new KnownHeader { Name = header, @@ -234,7 +232,6 @@ public static string GeneratedFile() "WWW-Authenticate", }) .Concat(corsResponseHeaders) - .Where((header) => header != "Content-Length") .Select((header, index) => new KnownHeader { Name = header, @@ -468,7 +465,7 @@ protected override void ClearFast() _bits = 0; return; }} - {Each(loop.Headers.Where(header => header.Index >= 0).OrderBy(h => !h.PrimaryHeader), header => $@" + {Each(loop.Headers.Where(header => header.Identifier != "ContentLength").OrderBy(h => !h.PrimaryHeader), header => $@" if ({header.TestBit()}) {{ _headers._{header.Identifier} = default(StringValues); @@ -487,7 +484,7 @@ protected override bool CopyToFast(KeyValuePair[] array, i {{ return false; }} - {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" + {Each(loop.Headers.Where(header => header.Identifier != "ContentLength"), header => $@" if ({header.TestBit()}) {{ if (arrayIndex == array.Length) @@ -514,20 +511,8 @@ protected override bool CopyToFast(KeyValuePair[] array, i protected void CopyToFast(ref MemoryPoolIterator output) {{ var tempBits = _bits | (_contentLength.HasValue ? {1L << 63}L : 0); - {Each(loop.Headers.OrderBy(h => !h.PrimaryHeader), header => $@" - {(header.Identifier == "ContentLength" ? $@" - if (_contentLength.HasValue) - {{ - output.CopyFrom(_headerBytes, {header.BytesOffset}, {header.BytesCount}); - output.CopyFromNumeric((ulong)ContentLength.Value); - - tempBits &= ~{1L << 63}L; - if(tempBits == 0) - {{ - return; - }} - }}" : $@" - if ({header.TestBit()}) + {Each(loop.Headers.Where(header => header.Identifier != "ContentLength").OrderBy(h => !h.PrimaryHeader), header => $@" + if ({header.TestTempBit()}) {{ {(header.EnhancedSetter == false ? "" : $@" if (_headers._raw{header.Identifier} != null) {{ @@ -552,8 +537,18 @@ protected void CopyToFast(ref MemoryPoolIterator output) {{ return; }} - }}")} - ")} + }}{(header.Identifier == "Server" ? $@" + if ((tempBits & {1L << 63}L) != 0) + {{ + output.CopyFrom(_headerBytes, {loop.Headers.First(x => x.Identifier == "ContentLength").BytesOffset}, {loop.Headers.First(x => x.Identifier == "ContentLength").BytesCount}); + output.CopyFromNumeric((ulong)ContentLength.Value); + + tempBits &= ~{1L << 63}L; + if(tempBits == 0) + {{ + return; + }} + }}" : "")}")} }}" : "")} {(loop.ClassName == "FrameRequestHeaders" ? $@" public unsafe void Append(byte[] keyBytes, int keyOffset, int keyLength, string value) @@ -576,7 +571,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int }}" : "")} private struct HeaderReferences - {{{Each(loop.Headers.Where(header => header.Index >= 0), header => @" + {{{Each(loop.Headers.Where(header => header.Identifier != "ContentLength"), header => @" public StringValues _" + header.Identifier + ";")} {Each(loop.Headers.Where(header => header.EnhancedSetter), header => @" public byte[] _raw" + header.Identifier + ";")} @@ -588,7 +583,7 @@ public bool MoveNext() {{ switch (_state) {{ - {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" + {Each(loop.Headers.Where(header => header.Identifier != "ContentLength"), header => $@" case {header.Index}: goto state{header.Index}; ")} @@ -597,7 +592,7 @@ public bool MoveNext() default: goto state_default; }} - {Each(loop.Headers.Where(header => header.Index >= 0), header => $@" + {Each(loop.Headers.Where(header => header.Identifier != "ContentLength"), header => $@" state{header.Index}: if ({header.TestBit()}) {{ From 1a3f4bffb7e275fbb0fb4f895a48338501f6f957 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 23 Jan 2017 07:04:30 +0000 Subject: [PATCH 13/18] Test before set --- .../Internal/Http/FrameHeaders.Generated.cs | 140 +++++++++--------- .../KnownHeaders.cs | 5 +- 2 files changed, 73 insertions(+), 72 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index b8c89bc37..c730c0014 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -7777,11 +7777,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~2L; - if(tempBits == 0) + if((tempBits & ~2L) == 0) { return; } + tempBits &= ~2L; } if ((tempBits & 4L) != 0) { @@ -7803,11 +7803,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~4L; - if(tempBits == 0) + if((tempBits & ~4L) == 0) { return; } + tempBits &= ~4L; } if ((tempBits & 2048L) != 0) { @@ -7824,11 +7824,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~2048L; - if(tempBits == 0) + if((tempBits & ~2048L) == 0) { return; } + tempBits &= ~2048L; } if ((tempBits & 33554432L) != 0) { @@ -7850,11 +7850,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~33554432L; - if(tempBits == 0) + if((tempBits & ~33554432L) == 0) { return; } + tempBits &= ~33554432L; } if ((tempBits & -9223372036854775808L) != 0) { @@ -7882,11 +7882,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~1L; - if(tempBits == 0) + if((tempBits & ~1L) == 0) { return; } + tempBits &= ~1L; } if ((tempBits & 8L) != 0) { @@ -7903,11 +7903,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~8L; - if(tempBits == 0) + if((tempBits & ~8L) == 0) { return; } + tempBits &= ~8L; } if ((tempBits & 16L) != 0) { @@ -7924,11 +7924,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~16L; - if(tempBits == 0) + if((tempBits & ~16L) == 0) { return; } + tempBits &= ~16L; } if ((tempBits & 32L) != 0) { @@ -7945,11 +7945,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~32L; - if(tempBits == 0) + if((tempBits & ~32L) == 0) { return; } + tempBits &= ~32L; } if ((tempBits & 64L) != 0) { @@ -7971,11 +7971,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~64L; - if(tempBits == 0) + if((tempBits & ~64L) == 0) { return; } + tempBits &= ~64L; } if ((tempBits & 128L) != 0) { @@ -7992,11 +7992,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~128L; - if(tempBits == 0) + if((tempBits & ~128L) == 0) { return; } + tempBits &= ~128L; } if ((tempBits & 256L) != 0) { @@ -8013,11 +8013,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~256L; - if(tempBits == 0) + if((tempBits & ~256L) == 0) { return; } + tempBits &= ~256L; } if ((tempBits & 512L) != 0) { @@ -8034,11 +8034,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~512L; - if(tempBits == 0) + if((tempBits & ~512L) == 0) { return; } + tempBits &= ~512L; } if ((tempBits & 1024L) != 0) { @@ -8055,11 +8055,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~1024L; - if(tempBits == 0) + if((tempBits & ~1024L) == 0) { return; } + tempBits &= ~1024L; } if ((tempBits & 4096L) != 0) { @@ -8076,11 +8076,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~4096L; - if(tempBits == 0) + if((tempBits & ~4096L) == 0) { return; } + tempBits &= ~4096L; } if ((tempBits & 8192L) != 0) { @@ -8097,11 +8097,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~8192L; - if(tempBits == 0) + if((tempBits & ~8192L) == 0) { return; } + tempBits &= ~8192L; } if ((tempBits & 16384L) != 0) { @@ -8118,11 +8118,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~16384L; - if(tempBits == 0) + if((tempBits & ~16384L) == 0) { return; } + tempBits &= ~16384L; } if ((tempBits & 32768L) != 0) { @@ -8139,11 +8139,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~32768L; - if(tempBits == 0) + if((tempBits & ~32768L) == 0) { return; } + tempBits &= ~32768L; } if ((tempBits & 65536L) != 0) { @@ -8160,11 +8160,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~65536L; - if(tempBits == 0) + if((tempBits & ~65536L) == 0) { return; } + tempBits &= ~65536L; } if ((tempBits & 131072L) != 0) { @@ -8181,11 +8181,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~131072L; - if(tempBits == 0) + if((tempBits & ~131072L) == 0) { return; } + tempBits &= ~131072L; } if ((tempBits & 262144L) != 0) { @@ -8202,11 +8202,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~262144L; - if(tempBits == 0) + if((tempBits & ~262144L) == 0) { return; } + tempBits &= ~262144L; } if ((tempBits & 524288L) != 0) { @@ -8223,11 +8223,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~524288L; - if(tempBits == 0) + if((tempBits & ~524288L) == 0) { return; } + tempBits &= ~524288L; } if ((tempBits & 1048576L) != 0) { @@ -8244,11 +8244,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~1048576L; - if(tempBits == 0) + if((tempBits & ~1048576L) == 0) { return; } + tempBits &= ~1048576L; } if ((tempBits & 2097152L) != 0) { @@ -8265,11 +8265,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~2097152L; - if(tempBits == 0) + if((tempBits & ~2097152L) == 0) { return; } + tempBits &= ~2097152L; } if ((tempBits & 4194304L) != 0) { @@ -8286,11 +8286,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~4194304L; - if(tempBits == 0) + if((tempBits & ~4194304L) == 0) { return; } + tempBits &= ~4194304L; } if ((tempBits & 8388608L) != 0) { @@ -8307,11 +8307,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~8388608L; - if(tempBits == 0) + if((tempBits & ~8388608L) == 0) { return; } + tempBits &= ~8388608L; } if ((tempBits & 16777216L) != 0) { @@ -8328,11 +8328,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~16777216L; - if(tempBits == 0) + if((tempBits & ~16777216L) == 0) { return; } + tempBits &= ~16777216L; } if ((tempBits & 67108864L) != 0) { @@ -8349,11 +8349,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~67108864L; - if(tempBits == 0) + if((tempBits & ~67108864L) == 0) { return; } + tempBits &= ~67108864L; } if ((tempBits & 134217728L) != 0) { @@ -8370,11 +8370,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~134217728L; - if(tempBits == 0) + if((tempBits & ~134217728L) == 0) { return; } + tempBits &= ~134217728L; } if ((tempBits & 268435456L) != 0) { @@ -8391,11 +8391,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~268435456L; - if(tempBits == 0) + if((tempBits & ~268435456L) == 0) { return; } + tempBits &= ~268435456L; } if ((tempBits & 536870912L) != 0) { @@ -8412,11 +8412,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~536870912L; - if(tempBits == 0) + if((tempBits & ~536870912L) == 0) { return; } + tempBits &= ~536870912L; } if ((tempBits & 1073741824L) != 0) { @@ -8433,11 +8433,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~1073741824L; - if(tempBits == 0) + if((tempBits & ~1073741824L) == 0) { return; } + tempBits &= ~1073741824L; } if ((tempBits & 2147483648L) != 0) { @@ -8454,11 +8454,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~2147483648L; - if(tempBits == 0) + if((tempBits & ~2147483648L) == 0) { return; } + tempBits &= ~2147483648L; } if ((tempBits & 4294967296L) != 0) { @@ -8475,11 +8475,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~4294967296L; - if(tempBits == 0) + if((tempBits & ~4294967296L) == 0) { return; } + tempBits &= ~4294967296L; } if ((tempBits & 8589934592L) != 0) { @@ -8496,11 +8496,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~8589934592L; - if(tempBits == 0) + if((tempBits & ~8589934592L) == 0) { return; } + tempBits &= ~8589934592L; } if ((tempBits & 17179869184L) != 0) { @@ -8517,11 +8517,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) } } - tempBits &= ~17179869184L; - if(tempBits == 0) + if((tempBits & ~17179869184L) == 0) { return; } + tempBits &= ~17179869184L; } } diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index e4f550493..01f7fcba9 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -68,6 +68,7 @@ class KnownHeader public bool PrimaryHeader { get; set; } public string TestBit() => $"(_bits & {1L << Index}L) != 0"; public string TestTempBit() => $"(tempBits & {1L << Index}L) != 0"; + public string TestNotTempBit() => $"(tempBits & ~{1L << Index}L) == 0"; public string TestNotBit() => $"(_bits & {1L << Index}L) == 0"; public string SetBit() => $"_bits |= {1L << Index}L"; public string ClearBit() => $"_bits &= ~{1L << Index}L"; @@ -532,11 +533,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) }} }} - tempBits &= ~{1L << header.Index}L; - if(tempBits == 0) + if({header.TestNotTempBit()}) {{ return; }} + tempBits &= ~{1L << header.Index}L; }}{(header.Identifier == "Server" ? $@" if ((tempBits & {1L << 63}L) != 0) {{ From 6333f36c3c427b9a97907fca6144930eca16e66d Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 23 Jan 2017 15:43:29 +0000 Subject: [PATCH 14/18] Clear test before set, use local var --- .../Internal/Http/FrameHeaders.Generated.cs | 480 +++++++++--------- .../ResponseHeaders.cs | 209 ++++++++ 2 files changed, 451 insertions(+), 238 deletions(-) create mode 100644 test/Microsoft.AspNetCore.Server.Kestrel.Performance/ResponseHeaders.cs diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index c730c0014..d7ddf6645 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -2652,441 +2652,443 @@ protected override void ClearFast() { MaybeUnknown?.Clear(); _contentLength = null; - if(FrameHeaders.BitCount(_bits) > 12) + var tempBits = _bits; + _bits = 0; + + if(FrameHeaders.BitCount(tempBits) > 12) { _headers = default(HeaderReferences); - _bits = 0; return; } - if ((_bits & 524288L) != 0) + if ((tempBits & 524288L) != 0) { _headers._Accept = default(StringValues); - _bits &= ~524288L; - if(_bits == 0) + if((tempBits & ~524288L) == 0) { return; } + tempBits &= ~524288L; } - if ((_bits & 134217728L) != 0) + if ((tempBits & 134217728L) != 0) { _headers._Host = default(StringValues); - _bits &= ~134217728L; - if(_bits == 0) + if((tempBits & ~134217728L) == 0) { return; } + tempBits &= ~134217728L; } - if ((_bits & 549755813888L) != 0) + if ((tempBits & 549755813888L) != 0) { _headers._UserAgent = default(StringValues); - _bits &= ~549755813888L; - if(_bits == 0) + if((tempBits & ~549755813888L) == 0) { return; } + tempBits &= ~549755813888L; } - if ((_bits & 1L) != 0) + if ((tempBits & 1L) != 0) { _headers._CacheControl = default(StringValues); - _bits &= ~1L; - if(_bits == 0) + if((tempBits & ~1L) == 0) { return; } + tempBits &= ~1L; } - if ((_bits & 2L) != 0) + if ((tempBits & 2L) != 0) { _headers._Connection = default(StringValues); - _bits &= ~2L; - if(_bits == 0) + if((tempBits & ~2L) == 0) { return; } + tempBits &= ~2L; } - if ((_bits & 4L) != 0) + if ((tempBits & 4L) != 0) { _headers._Date = default(StringValues); - _bits &= ~4L; - if(_bits == 0) + if((tempBits & ~4L) == 0) { return; } + tempBits &= ~4L; } - if ((_bits & 8L) != 0) + if ((tempBits & 8L) != 0) { _headers._KeepAlive = default(StringValues); - _bits &= ~8L; - if(_bits == 0) + if((tempBits & ~8L) == 0) { return; } + tempBits &= ~8L; } - if ((_bits & 16L) != 0) + if ((tempBits & 16L) != 0) { _headers._Pragma = default(StringValues); - _bits &= ~16L; - if(_bits == 0) + if((tempBits & ~16L) == 0) { return; } + tempBits &= ~16L; } - if ((_bits & 32L) != 0) + if ((tempBits & 32L) != 0) { _headers._Trailer = default(StringValues); - _bits &= ~32L; - if(_bits == 0) + if((tempBits & ~32L) == 0) { return; } + tempBits &= ~32L; } - if ((_bits & 64L) != 0) + if ((tempBits & 64L) != 0) { _headers._TransferEncoding = default(StringValues); - _bits &= ~64L; - if(_bits == 0) + if((tempBits & ~64L) == 0) { return; } + tempBits &= ~64L; } - if ((_bits & 128L) != 0) + if ((tempBits & 128L) != 0) { _headers._Upgrade = default(StringValues); - _bits &= ~128L; - if(_bits == 0) + if((tempBits & ~128L) == 0) { return; } + tempBits &= ~128L; } - if ((_bits & 256L) != 0) + if ((tempBits & 256L) != 0) { _headers._Via = default(StringValues); - _bits &= ~256L; - if(_bits == 0) + if((tempBits & ~256L) == 0) { return; } + tempBits &= ~256L; } - if ((_bits & 512L) != 0) + if ((tempBits & 512L) != 0) { _headers._Warning = default(StringValues); - _bits &= ~512L; - if(_bits == 0) + if((tempBits & ~512L) == 0) { return; } + tempBits &= ~512L; } - if ((_bits & 1024L) != 0) + if ((tempBits & 1024L) != 0) { _headers._Allow = default(StringValues); - _bits &= ~1024L; - if(_bits == 0) + if((tempBits & ~1024L) == 0) { return; } + tempBits &= ~1024L; } - if ((_bits & 2048L) != 0) + if ((tempBits & 2048L) != 0) { _headers._ContentType = default(StringValues); - _bits &= ~2048L; - if(_bits == 0) + if((tempBits & ~2048L) == 0) { return; } + tempBits &= ~2048L; } - if ((_bits & 4096L) != 0) + if ((tempBits & 4096L) != 0) { _headers._ContentEncoding = default(StringValues); - _bits &= ~4096L; - if(_bits == 0) + if((tempBits & ~4096L) == 0) { return; } + tempBits &= ~4096L; } - if ((_bits & 8192L) != 0) + if ((tempBits & 8192L) != 0) { _headers._ContentLanguage = default(StringValues); - _bits &= ~8192L; - if(_bits == 0) + if((tempBits & ~8192L) == 0) { return; } + tempBits &= ~8192L; } - if ((_bits & 16384L) != 0) + if ((tempBits & 16384L) != 0) { _headers._ContentLocation = default(StringValues); - _bits &= ~16384L; - if(_bits == 0) + if((tempBits & ~16384L) == 0) { return; } + tempBits &= ~16384L; } - if ((_bits & 32768L) != 0) + if ((tempBits & 32768L) != 0) { _headers._ContentMD5 = default(StringValues); - _bits &= ~32768L; - if(_bits == 0) + if((tempBits & ~32768L) == 0) { return; } + tempBits &= ~32768L; } - if ((_bits & 65536L) != 0) + if ((tempBits & 65536L) != 0) { _headers._ContentRange = default(StringValues); - _bits &= ~65536L; - if(_bits == 0) + if((tempBits & ~65536L) == 0) { return; } + tempBits &= ~65536L; } - if ((_bits & 131072L) != 0) + if ((tempBits & 131072L) != 0) { _headers._Expires = default(StringValues); - _bits &= ~131072L; - if(_bits == 0) + if((tempBits & ~131072L) == 0) { return; } + tempBits &= ~131072L; } - if ((_bits & 262144L) != 0) + if ((tempBits & 262144L) != 0) { _headers._LastModified = default(StringValues); - _bits &= ~262144L; - if(_bits == 0) + if((tempBits & ~262144L) == 0) { return; } + tempBits &= ~262144L; } - if ((_bits & 1048576L) != 0) + if ((tempBits & 1048576L) != 0) { _headers._AcceptCharset = default(StringValues); - _bits &= ~1048576L; - if(_bits == 0) + if((tempBits & ~1048576L) == 0) { return; } + tempBits &= ~1048576L; } - if ((_bits & 2097152L) != 0) + if ((tempBits & 2097152L) != 0) { _headers._AcceptEncoding = default(StringValues); - _bits &= ~2097152L; - if(_bits == 0) + if((tempBits & ~2097152L) == 0) { return; } + tempBits &= ~2097152L; } - if ((_bits & 4194304L) != 0) + if ((tempBits & 4194304L) != 0) { _headers._AcceptLanguage = default(StringValues); - _bits &= ~4194304L; - if(_bits == 0) + if((tempBits & ~4194304L) == 0) { return; } + tempBits &= ~4194304L; } - if ((_bits & 8388608L) != 0) + if ((tempBits & 8388608L) != 0) { _headers._Authorization = default(StringValues); - _bits &= ~8388608L; - if(_bits == 0) + if((tempBits & ~8388608L) == 0) { return; } + tempBits &= ~8388608L; } - if ((_bits & 16777216L) != 0) + if ((tempBits & 16777216L) != 0) { _headers._Cookie = default(StringValues); - _bits &= ~16777216L; - if(_bits == 0) + if((tempBits & ~16777216L) == 0) { return; } + tempBits &= ~16777216L; } - if ((_bits & 33554432L) != 0) + if ((tempBits & 33554432L) != 0) { _headers._Expect = default(StringValues); - _bits &= ~33554432L; - if(_bits == 0) + if((tempBits & ~33554432L) == 0) { return; } + tempBits &= ~33554432L; } - if ((_bits & 67108864L) != 0) + if ((tempBits & 67108864L) != 0) { _headers._From = default(StringValues); - _bits &= ~67108864L; - if(_bits == 0) + if((tempBits & ~67108864L) == 0) { return; } + tempBits &= ~67108864L; } - if ((_bits & 268435456L) != 0) + if ((tempBits & 268435456L) != 0) { _headers._IfMatch = default(StringValues); - _bits &= ~268435456L; - if(_bits == 0) + if((tempBits & ~268435456L) == 0) { return; } + tempBits &= ~268435456L; } - if ((_bits & 536870912L) != 0) + if ((tempBits & 536870912L) != 0) { _headers._IfModifiedSince = default(StringValues); - _bits &= ~536870912L; - if(_bits == 0) + if((tempBits & ~536870912L) == 0) { return; } + tempBits &= ~536870912L; } - if ((_bits & 1073741824L) != 0) + if ((tempBits & 1073741824L) != 0) { _headers._IfNoneMatch = default(StringValues); - _bits &= ~1073741824L; - if(_bits == 0) + if((tempBits & ~1073741824L) == 0) { return; } + tempBits &= ~1073741824L; } - if ((_bits & 2147483648L) != 0) + if ((tempBits & 2147483648L) != 0) { _headers._IfRange = default(StringValues); - _bits &= ~2147483648L; - if(_bits == 0) + if((tempBits & ~2147483648L) == 0) { return; } + tempBits &= ~2147483648L; } - if ((_bits & 4294967296L) != 0) + if ((tempBits & 4294967296L) != 0) { _headers._IfUnmodifiedSince = default(StringValues); - _bits &= ~4294967296L; - if(_bits == 0) + if((tempBits & ~4294967296L) == 0) { return; } + tempBits &= ~4294967296L; } - if ((_bits & 8589934592L) != 0) + if ((tempBits & 8589934592L) != 0) { _headers._MaxForwards = default(StringValues); - _bits &= ~8589934592L; - if(_bits == 0) + if((tempBits & ~8589934592L) == 0) { return; } + tempBits &= ~8589934592L; } - if ((_bits & 17179869184L) != 0) + if ((tempBits & 17179869184L) != 0) { _headers._ProxyAuthorization = default(StringValues); - _bits &= ~17179869184L; - if(_bits == 0) + if((tempBits & ~17179869184L) == 0) { return; } + tempBits &= ~17179869184L; } - if ((_bits & 34359738368L) != 0) + if ((tempBits & 34359738368L) != 0) { _headers._Referer = default(StringValues); - _bits &= ~34359738368L; - if(_bits == 0) + if((tempBits & ~34359738368L) == 0) { return; } + tempBits &= ~34359738368L; } - if ((_bits & 68719476736L) != 0) + if ((tempBits & 68719476736L) != 0) { _headers._Range = default(StringValues); - _bits &= ~68719476736L; - if(_bits == 0) + if((tempBits & ~68719476736L) == 0) { return; } + tempBits &= ~68719476736L; } - if ((_bits & 137438953472L) != 0) + if ((tempBits & 137438953472L) != 0) { _headers._TE = default(StringValues); - _bits &= ~137438953472L; - if(_bits == 0) + if((tempBits & ~137438953472L) == 0) { return; } + tempBits &= ~137438953472L; } - if ((_bits & 274877906944L) != 0) + if ((tempBits & 274877906944L) != 0) { _headers._Translate = default(StringValues); - _bits &= ~274877906944L; - if(_bits == 0) + if((tempBits & ~274877906944L) == 0) { return; } + tempBits &= ~274877906944L; } - if ((_bits & 1099511627776L) != 0) + if ((tempBits & 1099511627776L) != 0) { _headers._Origin = default(StringValues); - _bits &= ~1099511627776L; - if(_bits == 0) + if((tempBits & ~1099511627776L) == 0) { return; } + tempBits &= ~1099511627776L; } - if ((_bits & 2199023255552L) != 0) + if ((tempBits & 2199023255552L) != 0) { _headers._AccessControlRequestMethod = default(StringValues); - _bits &= ~2199023255552L; - if(_bits == 0) + if((tempBits & ~2199023255552L) == 0) { return; } + tempBits &= ~2199023255552L; } - if ((_bits & 4398046511104L) != 0) + if ((tempBits & 4398046511104L) != 0) { _headers._AccessControlRequestHeaders = default(StringValues); - _bits &= ~4398046511104L; - if(_bits == 0) + if((tempBits & ~4398046511104L) == 0) { return; } + tempBits &= ~4398046511104L; } } @@ -7058,361 +7060,363 @@ protected override void ClearFast() { MaybeUnknown?.Clear(); _contentLength = null; - if(FrameHeaders.BitCount(_bits) > 12) + var tempBits = _bits; + _bits = 0; + + if(FrameHeaders.BitCount(tempBits) > 12) { _headers = default(HeaderReferences); - _bits = 0; return; } - if ((_bits & 2L) != 0) + if ((tempBits & 2L) != 0) { _headers._Connection = default(StringValues); - _bits &= ~2L; - if(_bits == 0) + if((tempBits & ~2L) == 0) { return; } + tempBits &= ~2L; } - if ((_bits & 4L) != 0) + if ((tempBits & 4L) != 0) { _headers._Date = default(StringValues); - _bits &= ~4L; - if(_bits == 0) + if((tempBits & ~4L) == 0) { return; } + tempBits &= ~4L; } - if ((_bits & 2048L) != 0) + if ((tempBits & 2048L) != 0) { _headers._ContentType = default(StringValues); - _bits &= ~2048L; - if(_bits == 0) + if((tempBits & ~2048L) == 0) { return; } + tempBits &= ~2048L; } - if ((_bits & 33554432L) != 0) + if ((tempBits & 33554432L) != 0) { _headers._Server = default(StringValues); - _bits &= ~33554432L; - if(_bits == 0) + if((tempBits & ~33554432L) == 0) { return; } + tempBits &= ~33554432L; } - if ((_bits & 1L) != 0) + if ((tempBits & 1L) != 0) { _headers._CacheControl = default(StringValues); - _bits &= ~1L; - if(_bits == 0) + if((tempBits & ~1L) == 0) { return; } + tempBits &= ~1L; } - if ((_bits & 8L) != 0) + if ((tempBits & 8L) != 0) { _headers._KeepAlive = default(StringValues); - _bits &= ~8L; - if(_bits == 0) + if((tempBits & ~8L) == 0) { return; } + tempBits &= ~8L; } - if ((_bits & 16L) != 0) + if ((tempBits & 16L) != 0) { _headers._Pragma = default(StringValues); - _bits &= ~16L; - if(_bits == 0) + if((tempBits & ~16L) == 0) { return; } + tempBits &= ~16L; } - if ((_bits & 32L) != 0) + if ((tempBits & 32L) != 0) { _headers._Trailer = default(StringValues); - _bits &= ~32L; - if(_bits == 0) + if((tempBits & ~32L) == 0) { return; } + tempBits &= ~32L; } - if ((_bits & 64L) != 0) + if ((tempBits & 64L) != 0) { _headers._TransferEncoding = default(StringValues); - _bits &= ~64L; - if(_bits == 0) + if((tempBits & ~64L) == 0) { return; } + tempBits &= ~64L; } - if ((_bits & 128L) != 0) + if ((tempBits & 128L) != 0) { _headers._Upgrade = default(StringValues); - _bits &= ~128L; - if(_bits == 0) + if((tempBits & ~128L) == 0) { return; } + tempBits &= ~128L; } - if ((_bits & 256L) != 0) + if ((tempBits & 256L) != 0) { _headers._Via = default(StringValues); - _bits &= ~256L; - if(_bits == 0) + if((tempBits & ~256L) == 0) { return; } + tempBits &= ~256L; } - if ((_bits & 512L) != 0) + if ((tempBits & 512L) != 0) { _headers._Warning = default(StringValues); - _bits &= ~512L; - if(_bits == 0) + if((tempBits & ~512L) == 0) { return; } + tempBits &= ~512L; } - if ((_bits & 1024L) != 0) + if ((tempBits & 1024L) != 0) { _headers._Allow = default(StringValues); - _bits &= ~1024L; - if(_bits == 0) + if((tempBits & ~1024L) == 0) { return; } + tempBits &= ~1024L; } - if ((_bits & 4096L) != 0) + if ((tempBits & 4096L) != 0) { _headers._ContentEncoding = default(StringValues); - _bits &= ~4096L; - if(_bits == 0) + if((tempBits & ~4096L) == 0) { return; } + tempBits &= ~4096L; } - if ((_bits & 8192L) != 0) + if ((tempBits & 8192L) != 0) { _headers._ContentLanguage = default(StringValues); - _bits &= ~8192L; - if(_bits == 0) + if((tempBits & ~8192L) == 0) { return; } + tempBits &= ~8192L; } - if ((_bits & 16384L) != 0) + if ((tempBits & 16384L) != 0) { _headers._ContentLocation = default(StringValues); - _bits &= ~16384L; - if(_bits == 0) + if((tempBits & ~16384L) == 0) { return; } + tempBits &= ~16384L; } - if ((_bits & 32768L) != 0) + if ((tempBits & 32768L) != 0) { _headers._ContentMD5 = default(StringValues); - _bits &= ~32768L; - if(_bits == 0) + if((tempBits & ~32768L) == 0) { return; } + tempBits &= ~32768L; } - if ((_bits & 65536L) != 0) + if ((tempBits & 65536L) != 0) { _headers._ContentRange = default(StringValues); - _bits &= ~65536L; - if(_bits == 0) + if((tempBits & ~65536L) == 0) { return; } + tempBits &= ~65536L; } - if ((_bits & 131072L) != 0) + if ((tempBits & 131072L) != 0) { _headers._Expires = default(StringValues); - _bits &= ~131072L; - if(_bits == 0) + if((tempBits & ~131072L) == 0) { return; } + tempBits &= ~131072L; } - if ((_bits & 262144L) != 0) + if ((tempBits & 262144L) != 0) { _headers._LastModified = default(StringValues); - _bits &= ~262144L; - if(_bits == 0) + if((tempBits & ~262144L) == 0) { return; } + tempBits &= ~262144L; } - if ((_bits & 524288L) != 0) + if ((tempBits & 524288L) != 0) { _headers._AcceptRanges = default(StringValues); - _bits &= ~524288L; - if(_bits == 0) + if((tempBits & ~524288L) == 0) { return; } + tempBits &= ~524288L; } - if ((_bits & 1048576L) != 0) + if ((tempBits & 1048576L) != 0) { _headers._Age = default(StringValues); - _bits &= ~1048576L; - if(_bits == 0) + if((tempBits & ~1048576L) == 0) { return; } + tempBits &= ~1048576L; } - if ((_bits & 2097152L) != 0) + if ((tempBits & 2097152L) != 0) { _headers._ETag = default(StringValues); - _bits &= ~2097152L; - if(_bits == 0) + if((tempBits & ~2097152L) == 0) { return; } + tempBits &= ~2097152L; } - if ((_bits & 4194304L) != 0) + if ((tempBits & 4194304L) != 0) { _headers._Location = default(StringValues); - _bits &= ~4194304L; - if(_bits == 0) + if((tempBits & ~4194304L) == 0) { return; } + tempBits &= ~4194304L; } - if ((_bits & 8388608L) != 0) + if ((tempBits & 8388608L) != 0) { _headers._ProxyAuthenticate = default(StringValues); - _bits &= ~8388608L; - if(_bits == 0) + if((tempBits & ~8388608L) == 0) { return; } + tempBits &= ~8388608L; } - if ((_bits & 16777216L) != 0) + if ((tempBits & 16777216L) != 0) { _headers._RetryAfter = default(StringValues); - _bits &= ~16777216L; - if(_bits == 0) + if((tempBits & ~16777216L) == 0) { return; } + tempBits &= ~16777216L; } - if ((_bits & 67108864L) != 0) + if ((tempBits & 67108864L) != 0) { _headers._SetCookie = default(StringValues); - _bits &= ~67108864L; - if(_bits == 0) + if((tempBits & ~67108864L) == 0) { return; } + tempBits &= ~67108864L; } - if ((_bits & 134217728L) != 0) + if ((tempBits & 134217728L) != 0) { _headers._Vary = default(StringValues); - _bits &= ~134217728L; - if(_bits == 0) + if((tempBits & ~134217728L) == 0) { return; } + tempBits &= ~134217728L; } - if ((_bits & 268435456L) != 0) + if ((tempBits & 268435456L) != 0) { _headers._WWWAuthenticate = default(StringValues); - _bits &= ~268435456L; - if(_bits == 0) + if((tempBits & ~268435456L) == 0) { return; } + tempBits &= ~268435456L; } - if ((_bits & 536870912L) != 0) + if ((tempBits & 536870912L) != 0) { _headers._AccessControlAllowCredentials = default(StringValues); - _bits &= ~536870912L; - if(_bits == 0) + if((tempBits & ~536870912L) == 0) { return; } + tempBits &= ~536870912L; } - if ((_bits & 1073741824L) != 0) + if ((tempBits & 1073741824L) != 0) { _headers._AccessControlAllowHeaders = default(StringValues); - _bits &= ~1073741824L; - if(_bits == 0) + if((tempBits & ~1073741824L) == 0) { return; } + tempBits &= ~1073741824L; } - if ((_bits & 2147483648L) != 0) + if ((tempBits & 2147483648L) != 0) { _headers._AccessControlAllowMethods = default(StringValues); - _bits &= ~2147483648L; - if(_bits == 0) + if((tempBits & ~2147483648L) == 0) { return; } + tempBits &= ~2147483648L; } - if ((_bits & 4294967296L) != 0) + if ((tempBits & 4294967296L) != 0) { _headers._AccessControlAllowOrigin = default(StringValues); - _bits &= ~4294967296L; - if(_bits == 0) + if((tempBits & ~4294967296L) == 0) { return; } + tempBits &= ~4294967296L; } - if ((_bits & 8589934592L) != 0) + if ((tempBits & 8589934592L) != 0) { _headers._AccessControlExposeHeaders = default(StringValues); - _bits &= ~8589934592L; - if(_bits == 0) + if((tempBits & ~8589934592L) == 0) { return; } + tempBits &= ~8589934592L; } - if ((_bits & 17179869184L) != 0) + if ((tempBits & 17179869184L) != 0) { _headers._AccessControlMaxAge = default(StringValues); - _bits &= ~17179869184L; - if(_bits == 0) + if((tempBits & ~17179869184L) == 0) { return; } + tempBits &= ~17179869184L; } } diff --git a/test/Microsoft.AspNetCore.Server.Kestrel.Performance/ResponseHeaders.cs b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/ResponseHeaders.cs new file mode 100644 index 000000000..a8dcf7946 --- /dev/null +++ b/test/Microsoft.AspNetCore.Server.Kestrel.Performance/ResponseHeaders.cs @@ -0,0 +1,209 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using BenchmarkDotNet.Attributes; +using Microsoft.AspNetCore.Server.Kestrel.Internal.Http; +using Microsoft.AspNetCore.Testing; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; +using System.Runtime.CompilerServices; +using System.Text; +using Microsoft.AspNetCore.Server.Kestrel.Internal.Infrastructure; + +namespace Microsoft.AspNetCore.Server.Kestrel.Performance +{ + [Config(typeof(CoreConfig))] + public class ResponseHeaders + { + private const int InnerLoopCount = 512; + + private static readonly byte[] _bytesServer = Encoding.ASCII.GetBytes("\r\nServer: Kestrel"); + private static readonly DateHeaderValueManager _dateHeaderValueManager = new DateHeaderValueManager(); + private static readonly MemoryPool _memoryPool = new MemoryPool(); + private FrameResponseHeaders _responseHeadersDirect; + private HttpResponse _response; + + [Params("ContentLengthNumeric", "ContentLengthString", "Plaintext", "Common", "Unknown")] + public string Type { get; set; } + + [Benchmark(OperationsPerInvoke = InnerLoopCount)] + public void SetHeaders() + { + switch (Type) + { + case "ContentLengthNumeric": + ContentLengthNumeric(InnerLoopCount); + break; + case "ContentLengthString": + ContentLengthString(InnerLoopCount); + break; + case "Plaintext": + Plaintext(InnerLoopCount); + break; + case "Common": + Common(InnerLoopCount); + break; + case "Unknown": + Unknown(InnerLoopCount); + break; + } + } + + [Benchmark(OperationsPerInvoke = InnerLoopCount)] + public void OutputHeaders() + { + for (var i = 0; i < InnerLoopCount; i++) + { + var block = _memoryPool.Lease(); + var iter = new MemoryPoolIterator(block); + _responseHeadersDirect.CopyTo(ref iter); + + ReturnBlocks(block); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void ContentLengthNumeric(int count) + { + for (var i = 0; i < count; i++) + { + _responseHeadersDirect.Reset(); + + _response.ContentLength = 0; + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void ContentLengthString(int count) + { + for (var i = 0; i < count; i++) + { + _responseHeadersDirect.Reset(); + + _response.Headers["Content-Length"] = "0"; + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void Plaintext(int count) + { + for (var i = 0; i < count; i++) + { + _responseHeadersDirect.Reset(); + + _response.StatusCode = 200; + _response.ContentType = "text/plain"; + _response.ContentLength = 13; + + var dateHeaderValues = _dateHeaderValueManager.GetDateHeaderValues(); + _responseHeadersDirect.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes); + _responseHeadersDirect.SetRawServer("Kestrel", _bytesServer); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void Common(int count) + { + for (var i = 0; i < count; i++) + { + _responseHeadersDirect.Reset(); + + _response.StatusCode = 200; + _response.ContentType = "text/css"; + _response.ContentLength = 421; + + var headers = _response.Headers; + + headers["Connection"] = "Close"; + headers["Cache-Control"] = "public, max-age=30672000"; + headers["Vary"] = "Accept-Encoding"; + headers["Content-Encoding"] = "gzip"; + headers["Expires"] = "Fri, 12 Jan 2018 22:01:55 GMT"; + headers["Last-Modified"] = "Wed, 22 Jun 2016 20:08:29 GMT"; + headers["Set-Cookie"] = "prov=20629ccd-8b0f-e8ef-2935-cd26609fc0bc; __qca=P0-1591065732-1479167353442; _ga=GA1.2.1298898376.1479167354; _gat=1; sgt=id=9519gfde_3347_4762_8762_df51458c8ec2; acct=t=why-is-%e0%a5%a7%e0%a5%a8%e0%a5%a9-numeric&s=why-is-%e0%a5%a7%e0%a5%a8%e0%a5%a9-numeric"; + headers["ETag"] = "\"54ef7954-1078\""; + headers["Transfer-Encoding"] = "chunked"; + headers["Content-Language"] = "en-gb"; + headers["Upgrade"] = "websocket"; + headers["Via"] = "1.1 varnish"; + headers["Access-Control-Allow-Origin"] = "*"; + headers["Access-Control-Allow-credentials"] = "true"; + headers["Access-Control-Expose-Headers"] = "Client-Protocol, Content-Length, Content-Type, X-Bandwidth-Est, X-Bandwidth-Est2, X-Bandwidth-Est-Comp, X-Bandwidth-Avg, X-Walltime-Ms, X-Sequence-Num"; + + var dateHeaderValues = _dateHeaderValueManager.GetDateHeaderValues(); + _responseHeadersDirect.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes); + _responseHeadersDirect.SetRawServer("Kestrel", _bytesServer); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void Unknown(int count) + { + for (var i = 0; i < count; i++) + { + _responseHeadersDirect.Reset(); + + _response.StatusCode = 200; + _response.ContentType = "text/plain"; + _response.ContentLength = 13; + + var headers = _response.Headers; + + headers["Link"] = "; rel=\"canonical\""; + headers["X-Ua-Compatible"] = "IE=Edge"; + headers["X-Powered-By"] = "ASP.NET"; + headers["X-Content-Type-Options"] = "nosniff"; + headers["X-Xss-Protection"] = "1; mode=block"; + headers["X-Frame-Options"] = "SAMEORIGIN"; + headers["Strict-Transport-Security"] = "max-age=31536000; includeSubDomains; preload"; + headers["Content-Security-Policy"] = "default-src 'none'; script-src 'self' cdnjs.cloudflare.com code.jquery.com scotthelme.disqus.com a.disquscdn.com www.google-analytics.com go.disqus.com platform.twitter.com cdn.syndication.twimg.com; style-src 'self' a.disquscdn.com fonts.googleapis.com cdnjs.cloudflare.com platform.twitter.com; img-src 'self' data: www.gravatar.com www.google-analytics.com links.services.disqus.com referrer.disqus.com a.disquscdn.com cdn.syndication.twimg.com syndication.twitter.com pbs.twimg.com platform.twitter.com abs.twimg.com; child-src fusiontables.googleusercontent.com fusiontables.google.com www.google.com disqus.com www.youtube.com syndication.twitter.com platform.twitter.com; frame-src fusiontables.googleusercontent.com fusiontables.google.com www.google.com disqus.com www.youtube.com syndication.twitter.com platform.twitter.com; connect-src 'self' links.services.disqus.com; font-src 'self' cdnjs.cloudflare.com fonts.gstatic.com fonts.googleapis.com; form-action 'self'; upgrade-insecure-requests;"; + + var dateHeaderValues = _dateHeaderValueManager.GetDateHeaderValues(); + _responseHeadersDirect.SetRawDate(dateHeaderValues.String, dateHeaderValues.Bytes); + _responseHeadersDirect.SetRawServer("Kestrel", _bytesServer); + } + } + + [Setup] + public void Setup() + { + var connectionContext = new MockConnection(new KestrelServerOptions()); + var frame = new Frame(application: null, context: connectionContext); + frame.Reset(); + frame.InitializeHeaders(); + _responseHeadersDirect = (FrameResponseHeaders)frame.ResponseHeaders; + var context = new DefaultHttpContext(frame); + _response = new DefaultHttpResponse(context); + + switch (Type) + { + case "ContentLengthNumeric": + ContentLengthNumeric(1); + break; + case "ContentLengthString": + ContentLengthString(1); + break; + case "Plaintext": + Plaintext(1); + break; + case "Common": + Common(1); + break; + case "Unknown": + Unknown(1); + break; + } + } + + private static void ReturnBlocks(MemoryPoolBlock block) + { + while (block != null) + { + var returningBlock = block; + block = returningBlock.Next; + + returningBlock.Pool.Return(returningBlock); + } + } + } +} From a1bfe6bc0b52d153b00f44912e04fcaf3bf0afd3 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 23 Jan 2017 19:01:36 +0000 Subject: [PATCH 15/18] Feedback --- .../BadHttpRequestException.cs | 2 +- .../Internal/Http/MessageBody.cs | 2 +- .../BadHttpRequestTests.cs | 8 +- .../FrameResponseHeadersTests.cs | 80 ------------------- .../MemoryPoolIteratorTests.cs | 80 +++++++++++++++++++ 5 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs b/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs index b854cc8dd..f7109710c 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/BadHttpRequestException.cs @@ -44,7 +44,7 @@ internal static BadHttpRequestException GetException(RequestRejectionReason reas ex = new BadHttpRequestException("Malformed request: invalid headers.", StatusCodes.Status400BadRequest); break; case RequestRejectionReason.MultipleContentLengths: - ex = new BadHttpRequestException("Multiple content length headers.", StatusCodes.Status400BadRequest); + ex = new BadHttpRequestException("Multiple Content-Length headers.", StatusCodes.Status400BadRequest); break; case RequestRejectionReason.UnexpectedEndOfRequestContent: ex = new BadHttpRequestException("Unexpected end of request content.", StatusCodes.Status400BadRequest); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs index 6cc21f083..99b10d1b4 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/MessageBody.cs @@ -325,7 +325,7 @@ protected override void OnConsumedBytes(int count) { if (count > 0) { - throw new InvalidDataException("Consuming non-existant data"); + throw new InvalidDataException("Consuming non-existent data"); } } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs index 73857d784..ab681e546 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/BadHttpRequestTests.cs @@ -202,14 +202,16 @@ public async Task BadRequestIfMethodRequiresLengthButNoContentLengthInHttp10Requ } } - [Fact] - public async Task BadRequestIfContentLengthInvalid() + [Theory] + [InlineData("NaN")] + [InlineData("-1")] + public async Task BadRequestIfContentLengthInvalid(string contentLength) { using (var server = new TestServer(context => { return Task.FromResult(0); })) { using (var connection = server.CreateConnection()) { - await connection.Send("GET / HTTP/1.1\r\nContent-Length: NaN\r\n\r\n"); + await connection.Send($"GET / HTTP/1.1\r\nContent-Length: {contentLength}\r\n\r\n"); await ReceiveBadRequestResponse(connection, "400 Bad Request", server.Context.DateHeaderValue); } } diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs index 4f8ffb52d..b3dee3d0c 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/FrameResponseHeadersTests.cs @@ -153,86 +153,6 @@ public void ThrowsWhenClearingHeadersAfterReadOnlyIsSet() Assert.Throws(() => dictionary.Clear()); } - [Fact] - public void CorrectContentLengthsOutput() - { - using(var pool = new MemoryPool()) - { - var block = pool.Lease(); - try - { - for (var i = 0u; i <= 9u; i++) - { - block.Reset(); - var iter = new MemoryPoolIterator(block); - iter.CopyFromNumeric(i); - - Assert.Equal(block.Array[block.Start], (byte)(i + '0')); - Assert.Equal(block.End, block.Start + 1); - Assert.Equal(iter.Index, block.End); - } - for (var i = 10u; i <= 99u; i++) - { - block.Reset(); - var iter = new MemoryPoolIterator(block); - iter.CopyFromNumeric(i); - - Assert.Equal(block.Array[block.Start], (byte)((i / 10) + '0')); - Assert.Equal(block.Array[block.Start + 1], (byte)((i % 10) + '0')); - - Assert.Equal(block.End, block.Start + 2); - Assert.Equal(iter.Index, block.End); - } - for (var i = 100u; i <= 999u; i++) - { - block.Reset(); - var iter = new MemoryPoolIterator(block); - iter.CopyFromNumeric(i); - - Assert.Equal(block.Array[block.Start], (byte)((i / 100) + '0')); - Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 100) / 10) + '0')); - Assert.Equal(block.Array[block.Start + 2], (byte)((i % 10) + '0')); - - Assert.Equal(block.End, block.Start + 3); - Assert.Equal(iter.Index, block.End); - } - for (var i = 1000u; i <= 9999u; i++) - { - block.Reset(); - var iter = new MemoryPoolIterator(block); - iter.CopyFromNumeric(i); - - Assert.Equal(block.Array[block.Start], (byte)((i / 1000) + '0')); - Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 1000) / 100) + '0')); - Assert.Equal(block.Array[block.Start + 2], (byte)(((i % 100) / 10) + '0')); - Assert.Equal(block.Array[block.Start + 3], (byte)((i % 10) + '0')); - - Assert.Equal(block.End, block.Start + 4); - Assert.Equal(iter.Index, block.End); - } - { - block.Reset(); - var iter = new MemoryPoolIterator(block); - iter.CopyFromNumeric(ulong.MaxValue); - - var outputBytes = Encoding.ASCII.GetBytes(ulong.MaxValue.ToString("0")); - - for (var i = 0; i < outputBytes.Length; i++) - { - Assert.Equal(block.Array[block.Start + i], outputBytes[i]); - } - - Assert.Equal(block.End, block.Start + outputBytes.Length); - Assert.Equal(iter.Index, block.End); - } - } - finally - { - pool.Return(block); - } - } - } - [Theory] [MemberData(nameof(BadContentLengths))] public void ThrowsWhenAddingContentLengthWithNonNumericValue(string contentLength) diff --git a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs index 1db21257a..1239cfa99 100644 --- a/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs +++ b/test/Microsoft.AspNetCore.Server.KestrelTests/MemoryPoolIteratorTests.cs @@ -1214,6 +1214,86 @@ public void TestGetAsciiStringEscaped(string input, string expected, int maxChar } } + [Fact] + public void CorrectContentLengthsOutput() + { + using (var pool = new MemoryPool()) + { + var block = pool.Lease(); + try + { + for (var i = 0u; i <= 9u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)(i + '0')); + Assert.Equal(block.End, block.Start + 1); + Assert.Equal(iter.Index, block.End); + } + for (var i = 10u; i <= 99u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 10) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 2); + Assert.Equal(iter.Index, block.End); + } + for (var i = 100u; i <= 999u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 100) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 100) / 10) + '0')); + Assert.Equal(block.Array[block.Start + 2], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 3); + Assert.Equal(iter.Index, block.End); + } + for (var i = 1000u; i <= 9999u; i++) + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(i); + + Assert.Equal(block.Array[block.Start], (byte)((i / 1000) + '0')); + Assert.Equal(block.Array[block.Start + 1], (byte)(((i % 1000) / 100) + '0')); + Assert.Equal(block.Array[block.Start + 2], (byte)(((i % 100) / 10) + '0')); + Assert.Equal(block.Array[block.Start + 3], (byte)((i % 10) + '0')); + + Assert.Equal(block.End, block.Start + 4); + Assert.Equal(iter.Index, block.End); + } + { + block.Reset(); + var iter = new MemoryPoolIterator(block); + iter.CopyFromNumeric(ulong.MaxValue); + + var outputBytes = Encoding.ASCII.GetBytes(ulong.MaxValue.ToString("0")); + + for (var i = 0; i < outputBytes.Length; i++) + { + Assert.Equal(block.Array[block.Start + i], outputBytes[i]); + } + + Assert.Equal(block.End, block.Start + outputBytes.Length); + Assert.Equal(iter.Index, block.End); + } + } + finally + { + pool.Return(block); + } + } + } + private delegate bool GetKnownString(MemoryPoolIterator iter, out string result); private void TestKnownStringsInterning(string input, string expected, GetKnownString action) From dc8004e3ab328d0003afae55007a8a905111b8fb Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 24 Jan 2017 02:17:13 +0000 Subject: [PATCH 16/18] Feedback --- .../Internal/Http/FrameHeaders.cs | 22 ++++--------------- .../Internal/Http/FrameRequestHeaders.cs | 12 +++++++++- .../Internal/Http/FrameResponseHeaders.cs | 8 ++++++- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs index 91a42d890..312fc0dfd 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.cs @@ -18,13 +18,14 @@ public abstract class FrameHeaders : IHeaderDictionary protected Dictionary MaybeUnknown; protected Dictionary Unknown => MaybeUnknown ?? (MaybeUnknown = new Dictionary(StringComparer.OrdinalIgnoreCase)); - public long? ContentLength { + public long? ContentLength + { get { return _contentLength; } set { if (value.HasValue && value.Value < 0) { - ThrowInvalidResponseContentLengthException(value.Value); + ThrowInvalidContentLengthException(value.Value); } _contentLength = value; } @@ -423,26 +424,11 @@ public static unsafe TransferCoding GetFinalTransferCoding(StringValues transfer return transferEncodingOptions; } - protected static void ThrowInvalidResponseContentLengthException(long value) + private static void ThrowInvalidContentLengthException(long value) { throw new ArgumentOutOfRangeException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); } - protected static void ThrowInvalidResponseContentLengthException(string value) - { - throw new InvalidOperationException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); - } - - protected static void ThrowInvalidRequestContentLengthException(string value) - { - throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidContentLength, value); - } - - protected static void ThrowRequestMultipleContentLengths() - { - throw BadHttpRequestException.GetException(RequestRejectionReason.MultipleContentLengths); - } - private static void ThrowInvalidHeaderCharacter(char ch) { throw new InvalidOperationException(string.Format("Invalid non-ASCII or control character in header: 0x{0:X4}", (ushort)ch)); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs index d21ee1a3a..736e8843b 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs @@ -17,7 +17,7 @@ private static long ParseContentLength(string value) long parsed; if (!HeaderUtilities.TryParseInt64(value, out parsed)) { - ThrowInvalidRequestContentLengthException(value); + ThrowInvalidContentLengthException(value); } return parsed; @@ -46,6 +46,16 @@ private unsafe void AppendUnknownHeaders(byte* pKeyBytes, int keyLength, string Unknown[key] = AppendValue(existing, value); } + private static void ThrowInvalidContentLengthException(string value) + { + throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidContentLength, value); + } + + private static void ThrowMultipleContentLengths() + { + throw BadHttpRequestException.GetException(RequestRejectionReason.MultipleContentLengths); + } + public Enumerator GetEnumerator() { return new Enumerator(this); diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs index bb45a2592..4666041dd 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameResponseHeaders.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections; using System.Collections.Generic; using System.Runtime.CompilerServices; @@ -59,7 +60,7 @@ private static long ParseContentLength(string value) long parsed; if (!HeaderUtilities.TryParseInt64(value, out parsed)) { - ThrowInvalidResponseContentLengthException(value); + ThrowInvalidContentLengthException(value); } return parsed; @@ -72,6 +73,11 @@ private void SetValueUnknown(string key, StringValues value) Unknown[key] = value; } + private static void ThrowInvalidContentLengthException(string value) + { + throw new InvalidOperationException($"Invalid Content-Length: \"{value}\". Value must be a positive integral number."); + } + public partial struct Enumerator : IEnumerator> { private readonly FrameResponseHeaders _collection; From 92b6bfa05a093cde70333bfed244697439213855 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 24 Jan 2017 20:51:40 +0000 Subject: [PATCH 17/18] Feedback --- .../Internal/Http/FrameHeaders.Generated.cs | 8 +++--- .../Infrastructure/MemoryPoolIterator.cs | 16 ++++++------ .../KnownHeaders.cs | 25 +++++++++++++------ 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index d7ddf6645..8e659c88b 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -2654,7 +2654,6 @@ protected override void ClearFast() _contentLength = null; var tempBits = _bits; _bits = 0; - if(FrameHeaders.BitCount(tempBits) > 12) { _headers = default(HeaderReferences); @@ -4051,7 +4050,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int { if (_contentLength.HasValue) { - ThrowRequestMultipleContentLengths(); + ThrowMultipleContentLengths(); } else { @@ -7062,7 +7061,6 @@ protected override void ClearFast() _contentLength = null; var tempBits = _bits; _bits = 0; - if(FrameHeaders.BitCount(tempBits) > 12) { _headers = default(HeaderReferences); @@ -7865,11 +7863,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) output.CopyFrom(_headerBytes, 592, 18); output.CopyFromNumeric((ulong)ContentLength.Value); - tempBits &= ~-9223372036854775808L; - if(tempBits == 0) + if((tempBits & ~-9223372036854775808L) == 0) { return; } + tempBits &= ~-9223372036854775808L; } if ((tempBits & 1L) != 0) { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs index c5f663cb7..07491b737 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Infrastructure/MemoryPoolIterator.cs @@ -1114,7 +1114,8 @@ public unsafe void CopyFromNumeric(ulong value) { if (bytesLeftInBlock < 1) { - goto overflow; + CopyFromNumericOverflow(value); + return; } _index = blockIndex + 1; block.End = blockIndex + 1; @@ -1125,7 +1126,8 @@ public unsafe void CopyFromNumeric(ulong value) { if (bytesLeftInBlock < 2) { - goto overflow; + CopyFromNumericOverflow(value); + return; } _index = blockIndex + 2; block.End = blockIndex + 2; @@ -1140,7 +1142,8 @@ public unsafe void CopyFromNumeric(ulong value) { if (bytesLeftInBlock < 3) { - goto overflow; + CopyFromNumericOverflow(value); + return; } _index = blockIndex + 3; block.End = blockIndex + 3; @@ -1155,13 +1158,8 @@ public unsafe void CopyFromNumeric(ulong value) } else { - goto overflow; + CopyFromNumericOverflow(value); } - - return; - - overflow: - CopyFromNumericOverflow(value); } [MethodImpl(MethodImplOptions.NoInlining)] diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index 01f7fcba9..e3d0c8801 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; @@ -32,7 +33,7 @@ static string AppendSwitch(IEnumerable> values, stri {{{(header.Identifier == "ContentLength" ? $@" if (_contentLength.HasValue) {{ - ThrowRequestMultipleContentLengths(); + ThrowMultipleContentLengths(); }} else {{ @@ -202,6 +203,9 @@ public static string GeneratedFile() PrimaryHeader = requestPrimaryHeaders.Contains("Content-Length") }}) .ToArray(); + Debug.Assert(requestHeaders.Length <= 64); + Debug.Assert(requestHeaders.Max(x => x.Index) <= 62); + var enhancedHeaders = new[] { "Connection", @@ -248,6 +252,10 @@ public static string GeneratedFile() PrimaryHeader = responsePrimaryHeaders.Contains("Content-Length") }}) .ToArray(); + // 63 for reponseHeaders as it steals one bit for Content-Length in CopyTo(ref MemoryPoolIterator output) + Debug.Assert(responseHeaders.Length <= 63); + Debug.Assert(responseHeaders.Max(x => x.Index) <= 62); + var loops = new[] { new @@ -460,21 +468,22 @@ protected override void ClearFast() {{ MaybeUnknown?.Clear(); _contentLength = null; - if(FrameHeaders.BitCount(_bits) > 12) + var tempBits = _bits; + _bits = 0; + if(FrameHeaders.BitCount(tempBits) > 12) {{ _headers = default(HeaderReferences); - _bits = 0; return; }} {Each(loop.Headers.Where(header => header.Identifier != "ContentLength").OrderBy(h => !h.PrimaryHeader), header => $@" - if ({header.TestBit()}) + if ({header.TestTempBit()}) {{ _headers._{header.Identifier} = default(StringValues); - {header.ClearBit()}; - if(_bits == 0) + if({header.TestNotTempBit()}) {{ return; }} + tempBits &= ~{1L << header.Index}L; }} ")} }} @@ -544,11 +553,11 @@ protected void CopyToFast(ref MemoryPoolIterator output) output.CopyFrom(_headerBytes, {loop.Headers.First(x => x.Identifier == "ContentLength").BytesOffset}, {loop.Headers.First(x => x.Identifier == "ContentLength").BytesCount}); output.CopyFromNumeric((ulong)ContentLength.Value); - tempBits &= ~{1L << 63}L; - if(tempBits == 0) + if((tempBits & ~{1L << 63}L) == 0) {{ return; }} + tempBits &= ~{1L << 63}L; }}" : "")}")} }}" : "")} {(loop.ClassName == "FrameRequestHeaders" ? $@" From 08ad3253c50d180568c4854960578a29c3cc27d8 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 24 Jan 2017 21:40:11 +0000 Subject: [PATCH 18/18] ThrowMultipleContentLengthsException --- .../Internal/Http/FrameHeaders.Generated.cs | 2 +- .../Internal/Http/FrameRequestHeaders.cs | 2 +- .../KnownHeaders.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs index 8e659c88b..7cfb64ff3 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameHeaders.Generated.cs @@ -4050,7 +4050,7 @@ private unsafe void AppendNonPrimaryHeaders(byte* pKeyBytes, int keyOffset, int { if (_contentLength.HasValue) { - ThrowMultipleContentLengths(); + ThrowMultipleContentLengthsException(); } else { diff --git a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs index 736e8843b..4dd46d5cf 100644 --- a/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Server.Kestrel/Internal/Http/FrameRequestHeaders.cs @@ -51,7 +51,7 @@ private static void ThrowInvalidContentLengthException(string value) throw BadHttpRequestException.GetException(RequestRejectionReason.InvalidContentLength, value); } - private static void ThrowMultipleContentLengths() + private static void ThrowMultipleContentLengthsException() { throw BadHttpRequestException.GetException(RequestRejectionReason.MultipleContentLengths); } diff --git a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs index e3d0c8801..96cc6a350 100644 --- a/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs +++ b/tools/Microsoft.AspNetCore.Server.Kestrel.GeneratedCode/KnownHeaders.cs @@ -33,7 +33,7 @@ static string AppendSwitch(IEnumerable> values, stri {{{(header.Identifier == "ContentLength" ? $@" if (_contentLength.HasValue) {{ - ThrowMultipleContentLengths(); + ThrowMultipleContentLengthsException(); }} else {{