blob: cb0884eb7b537732c9a3ae6fd0276cde5072e157 [file] [log] [blame]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.24
package http3
import "sync"
type tableEntry struct {
name string
value string
}
// staticTableEntry returns the static table entry with the given index.
func staticTableEntry(index int64) (tableEntry, error) {
if index >= int64(len(staticTableEntries)) {
return tableEntry{}, errQPACKDecompressionFailed
}
return staticTableEntries[index], nil
}
func initStaticTableMaps() {
staticTableByName = make(map[string]int)
staticTableByNameValue = make(map[tableEntry]int)
for i, ent := range staticTableEntries {
if _, ok := staticTableByName[ent.name]; !ok {
staticTableByName[ent.name] = i
}
staticTableByNameValue[ent] = i
}
}
var (
staticTableOnce sync.Once
staticTableByName map[string]int
staticTableByNameValue map[tableEntry]int
)
// https://www.rfc-editor.org/rfc/rfc9204.html#appendix-A
//
// Note that this is different from the HTTP/2 static table.
var staticTableEntries = [...]tableEntry{
0: {":authority", ""},
1: {":path", "/"},
2: {"age", "0"},
3: {"content-disposition", ""},
4: {"content-length", "0"},
5: {"cookie", ""},
6: {"date", ""},
7: {"etag", ""},
8: {"if-modified-since", ""},
9: {"if-none-match", ""},
10: {"last-modified", ""},
11: {"link", ""},
12: {"location", ""},
13: {"referer", ""},
14: {"set-cookie", ""},
15: {":method", "CONNECT"},
16: {":method", "DELETE"},
17: {":method", "GET"},
18: {":method", "HEAD"},
19: {":method", "OPTIONS"},
20: {":method", "POST"},
21: {":method", "PUT"},
22: {":scheme", "http"},
23: {":scheme", "https"},
24: {":status", "103"},
25: {":status", "200"},
26: {":status", "304"},
27: {":status", "404"},
28: {":status", "503"},
29: {"accept", "*/*"},
30: {"accept", "application/dns-message"},
31: {"accept-encoding", "gzip, deflate, br"},
32: {"accept-ranges", "bytes"},
33: {"access-control-allow-headers", "cache-control"},
34: {"access-control-allow-headers", "content-type"},
35: {"access-control-allow-origin", "*"},
36: {"cache-control", "max-age=0"},
37: {"cache-control", "max-age=2592000"},
38: {"cache-control", "max-age=604800"},
39: {"cache-control", "no-cache"},
40: {"cache-control", "no-store"},
41: {"cache-control", "public, max-age=31536000"},
42: {"content-encoding", "br"},
43: {"content-encoding", "gzip"},
44: {"content-type", "application/dns-message"},
45: {"content-type", "application/javascript"},
46: {"content-type", "application/json"},
47: {"content-type", "application/x-www-form-urlencoded"},
48: {"content-type", "image/gif"},
49: {"content-type", "image/jpeg"},
50: {"content-type", "image/png"},
51: {"content-type", "text/css"},
52: {"content-type", "text/html; charset=utf-8"},
53: {"content-type", "text/plain"},
54: {"content-type", "text/plain;charset=utf-8"},
55: {"range", "bytes=0-"},
56: {"strict-transport-security", "max-age=31536000"},
57: {"strict-transport-security", "max-age=31536000; includesubdomains"},
58: {"strict-transport-security", "max-age=31536000; includesubdomains; preload"},
59: {"vary", "accept-encoding"},
60: {"vary", "origin"},
61: {"x-content-type-options", "nosniff"},
62: {"x-xss-protection", "1; mode=block"},
63: {":status", "100"},
64: {":status", "204"},
65: {":status", "206"},
66: {":status", "302"},
67: {":status", "400"},
68: {":status", "403"},
69: {":status", "421"},
70: {":status", "425"},
71: {":status", "500"},
72: {"accept-language", ""},
73: {"access-control-allow-credentials", "FALSE"},
74: {"access-control-allow-credentials", "TRUE"},
75: {"access-control-allow-headers", "*"},
76: {"access-control-allow-methods", "get"},
77: {"access-control-allow-methods", "get, post, options"},
78: {"access-control-allow-methods", "options"},
79: {"access-control-expose-headers", "content-length"},
80: {"access-control-request-headers", "content-type"},
81: {"access-control-request-method", "get"},
82: {"access-control-request-method", "post"},
83: {"alt-svc", "clear"},
84: {"authorization", ""},
85: {"content-security-policy", "script-src 'none'; object-src 'none'; base-uri 'none'"},
86: {"early-data", "1"},
87: {"expect-ct", ""},
88: {"forwarded", ""},
89: {"if-range", ""},
90: {"origin", ""},
91: {"purpose", "prefetch"},
92: {"server", ""},
93: {"timing-allow-origin", "*"},
94: {"upgrade-insecure-requests", "1"},
95: {"user-agent", ""},
96: {"x-forwarded-for", ""},
97: {"x-frame-options", "deny"},
98: {"x-frame-options", "sameorigin"},
}