< Summary

Information
Class: System.Net.Http.Headers.KnownHeaders
Assembly: System.Net.Http
File(s): D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\Headers\KnownHeaders.cs
Line coverage
86%
Covered lines: 226
Uncovered lines: 34
Coverable lines: 260
Total lines: 410
Line coverage: 86.9%
Branch coverage
72%
Covered branches: 169
Total branches: 234
Branch coverage: 72.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.cctor()100%11100%
GetAltSvcHeaderParser()100%11100%
GetCandidate(...)73.89%22622682.19%
GetLower(T)100%11100%
TryGetKnownHeader(...)50%4485.71%
TryGetKnownHeader(...)0%440%

File(s)

D:\runner\runtime\src\libraries\System.Net.Http\src\System\Net\Http\Headers\KnownHeaders.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System.Net.Http.HPack;
 5using System.Net.Http.QPack;
 6using System.Numerics;
 7using System.Runtime.CompilerServices;
 8using System.Text;
 9
 10namespace System.Net.Http.Headers
 11{
 12    internal static class KnownHeaders
 13    {
 14        // If you add a new entry here, you need to add it to TryGetKnownHeader below as well.
 15
 116        public static readonly KnownHeader PseudoStatus = new(":status", HttpHeaderType.Response, parser: null);
 117        public static readonly KnownHeader Accept = new("Accept", HttpHeaderType.Request, MediaTypeHeaderParser.Multiple
 118        public static readonly KnownHeader AcceptCharset = new("Accept-Charset", HttpHeaderType.Request, GenericHeaderPa
 119        public static readonly KnownHeader AcceptEncoding = new("Accept-Encoding", HttpHeaderType.Request, GenericHeader
 120        public static readonly KnownHeader AcceptLanguage = new("Accept-Language", HttpHeaderType.Request, GenericHeader
 121        public static readonly KnownHeader AcceptPatch = new("Accept-Patch");
 122        public static readonly KnownHeader AcceptRanges = new("Accept-Ranges", HttpHeaderType.Response, GenericHeaderPar
 123        public static readonly KnownHeader AccessControlAllowCredentials = new("Access-Control-Allow-Credentials", HttpH
 124        public static readonly KnownHeader AccessControlAllowHeaders = new("Access-Control-Allow-Headers", HttpHeaderTyp
 125        public static readonly KnownHeader AccessControlAllowMethods = new("Access-Control-Allow-Methods", HttpHeaderTyp
 126        public static readonly KnownHeader AccessControlAllowOrigin = new("Access-Control-Allow-Origin", HttpHeaderType.
 127        public static readonly KnownHeader AccessControlExposeHeaders = new("Access-Control-Expose-Headers", HttpHeaderT
 128        public static readonly KnownHeader AccessControlMaxAge = new("Access-Control-Max-Age");
 129        public static readonly KnownHeader Age = new("Age", HttpHeaderType.Response | HttpHeaderType.NonTrailing, TimeSp
 130        public static readonly KnownHeader Allow = new("Allow", HttpHeaderType.Content, GenericHeaderParser.TokenListPar
 131        public static readonly KnownHeader AltSvc = new("Alt-Svc", HttpHeaderType.Response, GetAltSvcHeaderParser(), ["h
 132        public static readonly KnownHeader AltUsed = new("Alt-Used", HttpHeaderType.Request, parser: null);
 133        public static readonly KnownHeader Authorization = new("Authorization", HttpHeaderType.Request | HttpHeaderType.
 134        public static readonly KnownHeader CacheControl = new("Cache-Control", HttpHeaderType.General | HttpHeaderType.N
 135        public static readonly KnownHeader Connection = new("Connection", HttpHeaderType.General, GenericHeaderParser.To
 136        public static readonly KnownHeader ContentDisposition = new("Content-Disposition", HttpHeaderType.Content | Http
 137        public static readonly KnownHeader ContentEncoding = new("Content-Encoding", HttpHeaderType.Content | HttpHeader
 138        public static readonly KnownHeader ContentLanguage = new("Content-Language", HttpHeaderType.Content, GenericHead
 139        public static readonly KnownHeader ContentLength = new("Content-Length", HttpHeaderType.Content | HttpHeaderType
 140        public static readonly KnownHeader ContentLocation = new("Content-Location", HttpHeaderType.Content | HttpHeader
 141        public static readonly KnownHeader ContentMD5 = new("Content-MD5", HttpHeaderType.Content, ByteArrayHeaderParser
 142        public static readonly KnownHeader ContentRange = new("Content-Range", HttpHeaderType.Content | HttpHeaderType.N
 143        public static readonly KnownHeader ContentSecurityPolicy = new("Content-Security-Policy", ["upgrade-insecure-req
 144        public static readonly KnownHeader ContentType = new("Content-Type", HttpHeaderType.Content | HttpHeaderType.Non
 145        public static readonly KnownHeader Cookie = new("Cookie", HttpHeaderType.Custom, CookieHeaderParser.Parser, null
 146        public static readonly KnownHeader Cookie2 = new("Cookie2");
 147        public static readonly KnownHeader CrossOriginResourcePolicy = new("Cross-Origin-Resource-Policy", ["cross-origi
 148        public static readonly KnownHeader Date = new("Date", HttpHeaderType.General | HttpHeaderType.NonTrailing, DateH
 149        public static readonly KnownHeader ETag = new("ETag", HttpHeaderType.Response, GenericHeaderParser.SingleValueEn
 150        public static readonly KnownHeader Expect = new("Expect", HttpHeaderType.Request | HttpHeaderType.NonTrailing, G
 151        public static readonly KnownHeader ExpectCT = new("Expect-CT");
 152        public static readonly KnownHeader Expires = new("Expires", HttpHeaderType.Content | HttpHeaderType.NonTrailing,
 153        public static readonly KnownHeader From = new("From", HttpHeaderType.Request, GenericHeaderParser.SingleValuePar
 154        public static readonly KnownHeader GrpcEncoding = new("grpc-encoding", ["identity", "gzip", "deflate"]);
 155        public static readonly KnownHeader GrpcMessage = new("grpc-message");
 156        public static readonly KnownHeader GrpcStatus = new("grpc-status", ["0"]);
 157        public static readonly KnownHeader Host = new("Host", HttpHeaderType.Request | HttpHeaderType.NonTrailing, Gener
 158        public static readonly KnownHeader IfMatch = new("If-Match", HttpHeaderType.Request | HttpHeaderType.NonTrailing
 159        public static readonly KnownHeader IfModifiedSince = new("If-Modified-Since", HttpHeaderType.Request | HttpHeade
 160        public static readonly KnownHeader IfNoneMatch = new("If-None-Match", HttpHeaderType.Request | HttpHeaderType.No
 161        public static readonly KnownHeader IfRange = new("If-Range", HttpHeaderType.Request | HttpHeaderType.NonTrailing
 162        public static readonly KnownHeader IfUnmodifiedSince = new("If-Unmodified-Since", HttpHeaderType.Request | HttpH
 163        public static readonly KnownHeader KeepAlive = new("Keep-Alive");
 164        public static readonly KnownHeader LastModified = new("Last-Modified", HttpHeaderType.Content, DateHeaderParser.
 165        public static readonly KnownHeader Link = new("Link", null, H2StaticTable.Link, H3StaticTable.Link);
 166        public static readonly KnownHeader Location = new("Location", HttpHeaderType.Response | HttpHeaderType.NonTraili
 167        public static readonly KnownHeader MaxForwards = new("Max-Forwards", HttpHeaderType.Request | HttpHeaderType.Non
 168        public static readonly KnownHeader Origin = new("Origin", http3StaticTableIndex: H3StaticTable.Origin);
 169        public static readonly KnownHeader P3P = new("P3P");
 170        public static readonly KnownHeader Pragma = new("Pragma", HttpHeaderType.General | HttpHeaderType.NonTrailing, G
 171        public static readonly KnownHeader ProxyAuthenticate = new("Proxy-Authenticate", HttpHeaderType.Response | HttpH
 172        public static readonly KnownHeader ProxyAuthorization = new("Proxy-Authorization", HttpHeaderType.Request | Http
 173        public static readonly KnownHeader ProxyConnection = new("Proxy-Connection");
 174        public static readonly KnownHeader ProxySupport = new("Proxy-Support");
 175        public static readonly KnownHeader PublicKeyPins = new("Public-Key-Pins");
 176        public static readonly KnownHeader Range = new("Range", HttpHeaderType.Request | HttpHeaderType.NonTrailing, Gen
 177        public static readonly KnownHeader Referer = new("Referer", HttpHeaderType.Request, UriHeaderParser.RelativeOrAb
 178        public static readonly KnownHeader ReferrerPolicy = new("Referrer-Policy", ["same-origin", "strict-origin-when-c
 179        public static readonly KnownHeader Refresh = new("Refresh", null, H2StaticTable.Refresh);
 180        public static readonly KnownHeader RetryAfter = new("Retry-After", HttpHeaderType.Response | HttpHeaderType.NonT
 181        public static readonly KnownHeader SecWebSocketAccept = new("Sec-WebSocket-Accept");
 182        public static readonly KnownHeader SecWebSocketExtensions = new("Sec-WebSocket-Extensions", ["permessage-deflate
 183        public static readonly KnownHeader SecWebSocketKey = new("Sec-WebSocket-Key");
 184        public static readonly KnownHeader SecWebSocketProtocol = new("Sec-WebSocket-Protocol");
 185        public static readonly KnownHeader SecWebSocketVersion = new("Sec-WebSocket-Version");
 186        public static readonly KnownHeader Server = new("Server", HttpHeaderType.Response, ProductInfoHeaderParser.Multi
 187        public static readonly KnownHeader ServerTiming = new("Server-Timing");
 188        public static readonly KnownHeader SetCookie = new("Set-Cookie", HttpHeaderType.Custom | HttpHeaderType.NonTrail
 189        public static readonly KnownHeader SetCookie2 = new("Set-Cookie2", HttpHeaderType.Custom | HttpHeaderType.NonTra
 190        public static readonly KnownHeader StrictTransportSecurity = new("Strict-Transport-Security", ["max-age=31536000
 191        public static readonly KnownHeader TE = new("TE", HttpHeaderType.Request | HttpHeaderType.NonTrailing, TransferC
 192        public static readonly KnownHeader TimingAllowOrigin = new("Timing-Allow-Origin", ["*"]);
 193        public static readonly KnownHeader Trailer = new("Trailer", HttpHeaderType.General | HttpHeaderType.NonTrailing,
 194        public static readonly KnownHeader TransferEncoding = new("Transfer-Encoding", HttpHeaderType.General | HttpHead
 195        public static readonly KnownHeader TSV = new("TSV");
 196        public static readonly KnownHeader Upgrade = new("Upgrade", HttpHeaderType.General, GenericHeaderParser.Multiple
 197        public static readonly KnownHeader UpgradeInsecureRequests = new("Upgrade-Insecure-Requests", ["1"], http3Static
 198        public static readonly KnownHeader UserAgent = new("User-Agent", HttpHeaderType.Request, ProductInfoHeaderParser
 199        public static readonly KnownHeader Vary = new("Vary", HttpHeaderType.Response | HttpHeaderType.NonTrailing, Gene
 1100        public static readonly KnownHeader Via = new("Via", HttpHeaderType.General, GenericHeaderParser.MultipleValueVia
 1101        public static readonly KnownHeader WWWAuthenticate = new("WWW-Authenticate", HttpHeaderType.Response | HttpHeade
 1102        public static readonly KnownHeader Warning = new("Warning", HttpHeaderType.General | HttpHeaderType.NonTrailing,
 1103        public static readonly KnownHeader XAspNetVersion = new("X-AspNet-Version");
 1104        public static readonly KnownHeader XCache = new("X-Cache", ["HIT", "MISS", "hit", "miss"]);
 1105        public static readonly KnownHeader XContentDuration = new("X-Content-Duration");
 1106        public static readonly KnownHeader XContentTypeOptions = new("X-Content-Type-Options", ["nosniff"], http3StaticT
 1107        public static readonly KnownHeader XFrameOptions = new("X-Frame-Options", ["SAMEORIGIN", "DENY", "sameorigin", "
 1108        public static readonly KnownHeader XMSEdgeRef = new("X-MSEdge-Ref");
 1109        public static readonly KnownHeader XPoweredBy = new("X-Powered-By");
 1110        public static readonly KnownHeader XRequestID = new("X-Request-ID");
 1111        public static readonly KnownHeader XServedBy = new("X-Served-By");
 1112        public static readonly KnownHeader XUACompatible = new("X-UA-Compatible");
 1113        public static readonly KnownHeader XXssProtection = new("X-XSS-Protection", ["1; mode=block", "0", "1"]);
 114
 115#if TARGET_BROWSER || TARGET_WASI
 116        private static HttpHeaderParser? GetAltSvcHeaderParser() => null; // Allow for the AltSvcHeaderParser to be trim
 117#else
 1118        private static AltSvcHeaderParser? GetAltSvcHeaderParser() => AltSvcHeaderParser.Parser;
 119#endif
 120
 121        /// <summary>
 122        /// Find possible known header match via lookup on length and a distinguishing char for that length.
 123        /// </summary>
 124        /// <remarks>
 125        /// Matching is case-insensitive. Because of this, we do not preserve the case of the original header,
 126        /// whether from the wire or from the user explicitly setting a known header using a header name string.
 127        /// </remarks>
 128        private static KnownHeader? GetCandidate<T>(ReadOnlySpan<T> key)
 129            where T : struct, INumberBase<T>
 76631130        {
 131            // Lookup is performed by first switching on the header name's length, and then switching
 132            // on the most unique position in that length's string.
 133
 134            [MethodImpl(MethodImplOptions.AggressiveInlining)]
 73426135            static int GetLower(T value) => int.CreateTruncating(value) | 0x20;
 136
 76631137            switch (key.Length)
 138            {
 139                case 2:
 3158140                    return TE; // TE
 141
 142                case 3:
 5926143                    switch (GetLower(key[0]))
 144                    {
 58145                        case 'a': return Age; // [A]ge
 45146                        case 'p': return P3P; // [P]3P
 96147                        case 't': return TSV; // [T]SV
 5727148                        case 'v': return Via; // [V]ia
 149                    }
 0150                    break;
 151
 152                case 4:
 482153                    switch (GetLower(key[0]))
 154                    {
 15155                        case 'd': return Date; // [D]ate
 166156                        case 'e': return ETag; // [E]Tag
 43157                        case 'f': return From; // [F]rom
 192158                        case 'h': return Host; // [H]ost
 39159                        case 'l': return Link; // [L]ink
 27160                        case 'v': return Vary; // [V]ary
 161                    }
 0162                    break;
 163
 164                case 5:
 3472165                    switch (GetLower(key[0]))
 166                    {
 46167                        case 'a': return Allow; // [A]llow
 3426168                        case 'r': return Range; // [R]ange
 169                    }
 0170                    break;
 171
 172                case 6:
 9916173                    switch (GetLower(key[0]))
 174                    {
 1892175                        case 'a': return Accept; // [A]ccept
 48176                        case 'c': return Cookie; // [C]ookie
 4511177                        case 'e': return Expect; // [E]xpect
 15178                        case 'o': return Origin; // [O]rigin
 1128179                        case 'p': return Pragma; // [P]ragma
 2322180                        case 's': return Server; // [S]erver
 181                    }
 0182                    break;
 183
 184                case 7:
 8379185                    switch (GetLower(key[0]))
 186                    {
 26187                        case ':': return PseudoStatus; // [:]status
 1988188                        case 'a': return AltSvc;  // [A]lt-Svc
 48189                        case 'c': return Cookie2; // [C]ookie2
 16190                        case 'e': return Expires; // [E]xpires
 191                        case 'r':
 48192                            switch (GetLower(key[3]))
 193                            {
 24194                                case 'e': return Referer; // [R]ef[e]rer
 24195                                case 'r': return Refresh; // [R]ef[r]esh
 196                            }
 0197                            break;
 126198                        case 't': return Trailer; // [T]railer
 1577199                        case 'u': return Upgrade; // [U]pgrade
 4490200                        case 'w': return Warning; // [W]arning
 60201                        case 'x': return XCache;  // [X]-Cache
 202                    }
 0203                    break;
 204
 205                case 8:
 4763206                    switch (GetLower(key[3]))
 207                    {
 28208                        case '-': return AltUsed;  // Alt[-]Used
 233209                        case 'a': return Location; // Loc[a]tion
 1046210                        case 'm': return IfMatch;  // If-[M]atch
 3456211                        case 'r': return IfRange;  // If-[R]ange
 212                    }
 0213                    break;
 214
 215                case 9:
 39216                    return ExpectCT; // Expect-CT
 217
 218                case 10:
 2894219                    switch (GetLower(key[0]))
 220                    {
 97221                        case 'c': return Connection; // [C]onnection
 51222                        case 'k': return KeepAlive;  // [K]eep-Alive
 84223                        case 's': return SetCookie;  // [S]et-Cookie
 2662224                        case 'u': return UserAgent;  // [U]ser-Agent
 225                    }
 0226                    break;
 227
 228                case 11:
 351229                    switch (GetLower(key[0]))
 230                    {
 38231                        case 'c': return ContentMD5; // [C]ontent-MD5
 108232                        case 'g': return GrpcStatus; // [g]rpc-status
 103233                        case 'r': return RetryAfter; // [R]etry-After
 102234                        case 's': return SetCookie2; // [S]et-Cookie2
 0235                        case 'x': return XServedBy;  // [X]-Served-By
 236                    }
 0237                    break;
 238
 239                case 12:
 431240                    switch (GetLower(key[5]))
 241                    {
 39242                        case 'd': return XMSEdgeRef;  // X-MSE[d]ge-Ref
 36243                        case 'e': return XPoweredBy;  // X-Pow[e]red-By
 90244                        case 'm': return GrpcMessage; // grpc-[m]essage
 145245                        case 'n': return ContentType; // Conte[n]t-Type
 31246                        case 'o': return MaxForwards; // Max-F[o]rwards
 48247                        case 't': return AcceptPatch; // Accep[t]-Patch
 42248                        case 'u': return XRequestID;  // X-Req[u]est-ID
 249                    }
 0250                    break;
 251
 252                case 13:
 11255253                    switch (GetLower(key[12]))
 254                    {
 20255                        case 'd': return LastModified;  // Last-Modifie[d]
 373256                        case 'e': return ContentRange;  // Content-Rang[e]
 257                        case 'g':
 72258                            switch (GetLower(key[0]))
 259                            {
 48260                                case 's': return ServerTiming;  // [S]erver-Timin[g]
 24261                                case 'g': return GrpcEncoding;  // [g]rpc-encodin[g]
 262                            }
 0263                            break;
 64264                        case 'h': return IfNoneMatch;   // If-None-Matc[h]
 6029265                        case 'l': return CacheControl;  // Cache-Contro[l]
 4628266                        case 'n': return Authorization; // Authorizatio[n]
 42267                        case 's': return AcceptRanges;  // Accept-Range[s]
 27268                        case 't': return ProxySupport;  // Proxy-Suppor[t]
 269                    }
 0270                    break;
 271
 272                case 14:
 240273                    switch (GetLower(key[0]))
 274                    {
 45275                        case 'a': return AcceptCharset; // [A]ccept-Charset
 195276                        case 'c': return ContentLength; // [C]ontent-Length
 277                    }
 0278                    break;
 279
 280                case 15:
 1639281                    switch (GetLower(key[7]))
 282                    {
 33283                        case '-': return XFrameOptions;  // X-Frame[-]Options
 28284                        case 'e': return AcceptEncoding; // Accept-[E]ncoding
 15285                        case 'k': return PublicKeyPins;  // Public-[K]ey-Pins
 1428286                        case 'l': return AcceptLanguage; // Accept-[L]anguage
 78287                        case 'm': return XUACompatible;  // X-UA-Co[m]patible
 57288                        case 'r': return ReferrerPolicy; // Referre[r]-Policy
 289                    }
 0290                    break;
 291
 292                case 16:
 8174293                    switch (GetLower(key[11]))
 294                    {
 13295                        case 'a': return ContentLocation; // Content-Loc[a]tion
 296                        case 'c':
 150297                            switch (GetLower(key[0]))
 298                            {
 30299                                case 'p': return ProxyConnection; // [P]roxy-Conne[c]tion
 120300                                case 'x': return XXssProtection;  // [X]-XSS-Prote[c]tion
 301                            }
 0302                            break;
 138303                        case 'g': return ContentLanguage; // Content-Lan[g]uage
 7739304                        case 'i': return WWWAuthenticate; // WWW-Authent[i]cate
 74305                        case 'o': return ContentEncoding; // Content-Enc[o]ding
 60306                        case 'r': return XAspNetVersion;  // X-AspNet-Ve[r]sion
 307                    }
 0308                    break;
 309
 310                case 17:
 5703311                    switch (GetLower(key[0]))
 312                    {
 18313                        case 'i': return IfModifiedSince;  // [I]f-Modified-Since
 66314                        case 's': return SecWebSocketKey;  // [S]ec-WebSocket-Key
 5619315                        case 't': return TransferEncoding; // [T]ransfer-Encoding
 316                    }
 0317                    break;
 318
 319                case 18:
 8941320                    switch (GetLower(key[0]))
 321                    {
 8872322                        case 'p': return ProxyAuthenticate; // [P]roxy-Authenticate
 69323                        case 'x': return XContentDuration;  // [X]-Content-Duration
 324                    }
 0325                    break;
 326
 327                case 19:
 278328                    switch (GetLower(key[0]))
 329                    {
 201330                        case 'c': return ContentDisposition; // [C]ontent-Disposition
 18331                        case 'i': return IfUnmodifiedSince;  // [I]f-Unmodified-Since
 59332                        case 'p': return ProxyAuthorization; // [P]roxy-Authorization
 0333                        case 't': return TimingAllowOrigin;  // [T]iming-Allow-Origin
 334                    }
 0335                    break;
 336
 337                case 20:
 42338                    return SecWebSocketAccept; // Sec-WebSocket-Accept
 339
 340                case 21:
 78341                    return SecWebSocketVersion; // Sec-WebSocket-Version
 342
 343                case 22:
 111344                    switch (GetLower(key[0]))
 345                    {
 24346                        case 'a': return AccessControlMaxAge;  // [A]ccess-Control-Max-Age
 48347                        case 's': return SecWebSocketProtocol; // [S]ec-WebSocket-Protocol
 39348                        case 'x': return XContentTypeOptions;  // [X]-Content-Type-Options
 349                    }
 0350                    break;
 351
 352                case 23:
 42353                    return ContentSecurityPolicy; // Content-Security-Policy
 354
 355                case 24:
 39356                    return SecWebSocketExtensions; // Sec-WebSocket-Extensions
 357
 358                case 25:
 159359                    switch (GetLower(key[0]))
 360                    {
 66361                        case 's': return StrictTransportSecurity; // [S]trict-Transport-Security
 93362                        case 'u': return UpgradeInsecureRequests; // [U]pgrade-Insecure-Requests
 363                    }
 0364                    break;
 365
 366                case 27:
 21367                    return AccessControlAllowOrigin; // Access-Control-Allow-Origin
 368
 369                case 28:
 42370                    switch (GetLower(key[21]))
 371                    {
 21372                        case 'h': return AccessControlAllowHeaders; // Access-Control-Allow-[H]eaders
 21373                        case 'm': return AccessControlAllowMethods; // Access-Control-Allow-[M]ethods
 0374                        case '-': return CrossOriginResourcePolicy; // Cross-Origin-Resource[-]Policy
 375                    }
 0376                    break;
 377
 378                case 29:
 28379                    return AccessControlExposeHeaders; // Access-Control-Expose-Headers
 380
 381                case 32:
 28382                    return AccessControlAllowCredentials; // Access-Control-Allow-Credentials
 383            }
 384
 0385            return null;
 76631386        }
 387
 388        public static KnownHeader? TryGetKnownHeader(string name)
 76631389        {
 76631390            KnownHeader? candidate = GetCandidate<char>(name);
 76631391            if (candidate != null && StringComparer.OrdinalIgnoreCase.Equals(name, candidate.Name))
 76631392            {
 76631393                return candidate;
 394            }
 395
 0396            return null;
 76631397        }
 398
 399        public static KnownHeader? TryGetKnownHeader(ReadOnlySpan<byte> name)
 0400        {
 0401            KnownHeader? candidate = GetCandidate(name);
 0402            if (candidate != null && Ascii.EqualsIgnoreCase(name, candidate.Name))
 0403            {
 0404                return candidate;
 405            }
 406
 0407            return null;
 0408        }
 409    }
 410}