| | | 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 | | |
| | | 4 | | using System.Text; |
| | | 5 | | |
| | | 6 | | namespace System.Net.Http.QPack |
| | | 7 | | { |
| | | 8 | | internal static partial class H3StaticTable |
| | | 9 | | { |
| | | 10 | | public static bool TryGetStatusIndex(int status, out int index) |
| | | 11 | | { |
| | | 12 | | index = status switch |
| | | 13 | | { |
| | | 14 | | 103 => 24, |
| | | 15 | | 200 => 25, |
| | | 16 | | 304 => 26, |
| | | 17 | | 404 => 27, |
| | | 18 | | 503 => 28, |
| | | 19 | | 100 => 63, |
| | | 20 | | 204 => 64, |
| | | 21 | | 206 => 65, |
| | | 22 | | 302 => 66, |
| | | 23 | | 400 => 67, |
| | | 24 | | 403 => 68, |
| | | 25 | | 421 => 69, |
| | | 26 | | 425 => 70, |
| | | 27 | | 500 => 71, |
| | | 28 | | _ => -1 |
| | | 29 | | }; |
| | | 30 | | |
| | | 31 | | return index != -1; |
| | | 32 | | } |
| | | 33 | | |
| | 0 | 34 | | public static int Count => s_staticTable.Length; |
| | | 35 | | |
| | | 36 | | public static ref readonly HeaderField Get(int index) => ref s_staticTable[index]; |
| | | 37 | | |
| | 0 | 38 | | private static readonly HeaderField[] s_staticTable = new HeaderField[] |
| | 0 | 39 | | { |
| | 0 | 40 | | CreateHeaderField(":authority", ""), // 0 |
| | 0 | 41 | | CreateHeaderField(":path", "/"), // 1 |
| | 0 | 42 | | CreateHeaderField("age", "0"), // 2 |
| | 0 | 43 | | CreateHeaderField("content-disposition", ""), //3 |
| | 0 | 44 | | CreateHeaderField("content-length", "0"), // 4 |
| | 0 | 45 | | CreateHeaderField("cookie", ""), // 5 |
| | 0 | 46 | | CreateHeaderField("date", ""), // 6 |
| | 0 | 47 | | CreateHeaderField("etag", ""), // 7 |
| | 0 | 48 | | CreateHeaderField("if-modified-since", ""), // 8 |
| | 0 | 49 | | CreateHeaderField("if-none-match", ""), // 9 |
| | 0 | 50 | | CreateHeaderField("last-modified", ""), // 10 |
| | 0 | 51 | | CreateHeaderField("link", ""), // 11 |
| | 0 | 52 | | CreateHeaderField("location", ""), // 12 |
| | 0 | 53 | | CreateHeaderField("referer", ""), // 13 |
| | 0 | 54 | | CreateHeaderField("set-cookie", ""), // 14 |
| | 0 | 55 | | CreateHeaderField(":method", "CONNECT"), // 15 |
| | 0 | 56 | | CreateHeaderField(":method", "DELETE"), // 16 |
| | 0 | 57 | | CreateHeaderField(":method", "GET"), // 17 |
| | 0 | 58 | | CreateHeaderField(":method", "HEAD"), // 18 |
| | 0 | 59 | | CreateHeaderField(":method", "OPTIONS"), // 19 |
| | 0 | 60 | | CreateHeaderField(":method", "POST"), // 20 |
| | 0 | 61 | | CreateHeaderField(":method", "PUT"), // 21 |
| | 0 | 62 | | CreateHeaderField(":scheme", "http"), // 22 |
| | 0 | 63 | | CreateHeaderField(":scheme", "https"), // 23 |
| | 0 | 64 | | CreateHeaderField(":status", "103"), // 24 |
| | 0 | 65 | | CreateHeaderField(":status", "200"), // 25 |
| | 0 | 66 | | CreateHeaderField(":status", "304"), // 26 |
| | 0 | 67 | | CreateHeaderField(":status", "404"), // 27 |
| | 0 | 68 | | CreateHeaderField(":status", "503"), // 28 |
| | 0 | 69 | | CreateHeaderField("accept", "*/*"), //29 |
| | 0 | 70 | | CreateHeaderField("accept", "application/dns-message"), // 30 |
| | 0 | 71 | | CreateHeaderField("accept-encoding", "gzip, deflate, br"), // 31 |
| | 0 | 72 | | CreateHeaderField("accept-ranges", "bytes"), // 32 |
| | 0 | 73 | | CreateHeaderField("access-control-allow-headers", "cache-control"), // 33 |
| | 0 | 74 | | CreateHeaderField("access-control-allow-headers", "content-type"), // 34 |
| | 0 | 75 | | CreateHeaderField("access-control-allow-origin", "*"), // 35 |
| | 0 | 76 | | CreateHeaderField("cache-control", "max-age=0"), // 36 |
| | 0 | 77 | | CreateHeaderField("cache-control", "max-age=2592000"), // 37 |
| | 0 | 78 | | CreateHeaderField("cache-control", "max-age=604800"), // 38 |
| | 0 | 79 | | CreateHeaderField("cache-control", "no-cache"), // 39 |
| | 0 | 80 | | CreateHeaderField("cache-control", "no-store"), // 40 |
| | 0 | 81 | | CreateHeaderField("cache-control", "public, max-age=31536000"), // 41 |
| | 0 | 82 | | CreateHeaderField("content-encoding", "br"), // 42 |
| | 0 | 83 | | CreateHeaderField("content-encoding", "gzip"), // 43 |
| | 0 | 84 | | CreateHeaderField("content-type", "application/dns-message"), // 44 |
| | 0 | 85 | | CreateHeaderField("content-type", "application/javascript"), // 45 |
| | 0 | 86 | | CreateHeaderField("content-type", "application/json"), // 46 |
| | 0 | 87 | | CreateHeaderField("content-type", "application/x-www-form-urlencoded"), // 47 |
| | 0 | 88 | | CreateHeaderField("content-type", "image/gif"), // 48 |
| | 0 | 89 | | CreateHeaderField("content-type", "image/jpeg"), // 49 |
| | 0 | 90 | | CreateHeaderField("content-type", "image/png"), // 50 |
| | 0 | 91 | | CreateHeaderField("content-type", "text/css"), // 51 |
| | 0 | 92 | | CreateHeaderField("content-type", "text/html; charset=utf-8"), // 52 |
| | 0 | 93 | | CreateHeaderField("content-type", "text/plain"), // 53 |
| | 0 | 94 | | CreateHeaderField("content-type", "text/plain;charset=utf-8"), // 54 |
| | 0 | 95 | | CreateHeaderField("range", "bytes=0-"), // 55 |
| | 0 | 96 | | CreateHeaderField("strict-transport-security", "max-age=31536000"), // 56 |
| | 0 | 97 | | CreateHeaderField("strict-transport-security", "max-age=31536000; includesubdomains"), // 57; TODO confirm s |
| | 0 | 98 | | CreateHeaderField("strict-transport-security", "max-age=31536000; includesubdomains; preload"), // 58 |
| | 0 | 99 | | CreateHeaderField("vary", "accept-encoding"), // 59 |
| | 0 | 100 | | CreateHeaderField("vary", "origin"), // 60 |
| | 0 | 101 | | CreateHeaderField("x-content-type-options", "nosniff"), // 61 |
| | 0 | 102 | | CreateHeaderField("x-xss-protection", "1; mode=block"), // 62 |
| | 0 | 103 | | CreateHeaderField(":status", "100"), // 63 |
| | 0 | 104 | | CreateHeaderField(":status", "204"), // 64 |
| | 0 | 105 | | CreateHeaderField(":status", "206"), // 65 |
| | 0 | 106 | | CreateHeaderField(":status", "302"), // 66 |
| | 0 | 107 | | CreateHeaderField(":status", "400"), // 67 |
| | 0 | 108 | | CreateHeaderField(":status", "403"), // 68 |
| | 0 | 109 | | CreateHeaderField(":status", "421"), // 69 |
| | 0 | 110 | | CreateHeaderField(":status", "425"), // 70 |
| | 0 | 111 | | CreateHeaderField(":status", "500"), // 71 |
| | 0 | 112 | | CreateHeaderField("accept-language", ""), // 72 |
| | 0 | 113 | | CreateHeaderField("access-control-allow-credentials", "FALSE"), // 73 |
| | 0 | 114 | | CreateHeaderField("access-control-allow-credentials", "TRUE"), // 74 |
| | 0 | 115 | | CreateHeaderField("access-control-allow-headers", "*"), // 75 |
| | 0 | 116 | | CreateHeaderField("access-control-allow-methods", "get"), // 76 |
| | 0 | 117 | | CreateHeaderField("access-control-allow-methods", "get, post, options"), // 77 |
| | 0 | 118 | | CreateHeaderField("access-control-allow-methods", "options"), // 78 |
| | 0 | 119 | | CreateHeaderField("access-control-expose-headers", "content-length"), // 79 |
| | 0 | 120 | | CreateHeaderField("access-control-request-headers", "content-type"), // 80 |
| | 0 | 121 | | CreateHeaderField("access-control-request-method", "get"), // 81 |
| | 0 | 122 | | CreateHeaderField("access-control-request-method", "post"), // 82 |
| | 0 | 123 | | CreateHeaderField("alt-svc", "clear"), // 83 |
| | 0 | 124 | | CreateHeaderField("authorization", ""), // 84 |
| | 0 | 125 | | CreateHeaderField("content-security-policy", "script-src 'none'; object-src 'none'; base-uri 'none'"), // 85 |
| | 0 | 126 | | CreateHeaderField("early-data", "1"), // 86 |
| | 0 | 127 | | CreateHeaderField("expect-ct", ""), // 87 |
| | 0 | 128 | | CreateHeaderField("forwarded", ""), // 88 |
| | 0 | 129 | | CreateHeaderField("if-range", ""), // 89 |
| | 0 | 130 | | CreateHeaderField("origin", ""), // 90 |
| | 0 | 131 | | CreateHeaderField("purpose", "prefetch"), // 91 |
| | 0 | 132 | | CreateHeaderField("server", ""), // 92 |
| | 0 | 133 | | CreateHeaderField("timing-allow-origin", "*"), // 93 |
| | 0 | 134 | | CreateHeaderField("upgrade-insecure-requests", "1"), // 94 |
| | 0 | 135 | | CreateHeaderField("user-agent", ""), // 95 |
| | 0 | 136 | | CreateHeaderField("x-forwarded-for", ""), // 96 |
| | 0 | 137 | | CreateHeaderField("x-frame-options", "deny"), // 97 |
| | 0 | 138 | | CreateHeaderField("x-frame-options", "sameorigin"), // 98 |
| | 0 | 139 | | }; |
| | | 140 | | |
| | | 141 | | private static HeaderField CreateHeaderField(string name, string value) |
| | 0 | 142 | | => new HeaderField(Encoding.ASCII.GetBytes(name), Encoding.ASCII.GetBytes(value)); |
| | | 143 | | } |
| | | 144 | | } |
| | | 145 | | |