[server] Add an embedded list of canonical header names and values (helps with eliminating allocations in FastHTTP to Go HTTP bridging).
This commit is contained in:
parent
f1528ce48b
commit
e817765cfd
1 changed files with 225 additions and 0 deletions
225
sources/lib/server/headers.go
Normal file
225
sources/lib/server/headers.go
Normal file
|
@ -0,0 +1,225 @@
|
||||||
|
|
||||||
|
|
||||||
|
package server
|
||||||
|
|
||||||
|
|
||||||
|
import "fmt"
|
||||||
|
import "net/http"
|
||||||
|
import "strings"
|
||||||
|
|
||||||
|
|
||||||
|
import . "github.com/volution/kawipiko/lib/common"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func CanonicalHeaderNameFromBytes (_header []byte) (string) {
|
||||||
|
if _canonical, _found := CanonicalHeaderNamesMap[BytesToString (*NoEscapeBytes (&_header))]; _found {
|
||||||
|
return _canonical
|
||||||
|
} else {
|
||||||
|
return string (_header)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func CanonicalHeaderValueFromBytes (_value []byte) (string) {
|
||||||
|
if _canonical, _found := CanonicalHeaderValuesMap[BytesToString (*NoEscapeBytes (&_value))]; _found {
|
||||||
|
return _canonical
|
||||||
|
} else {
|
||||||
|
return string (_value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func CanonicalHeaderValueRegister (_value string) () {
|
||||||
|
CanonicalHeaderValues = append (CanonicalHeaderValues, _value)
|
||||||
|
CanonicalHeaderValuesMap[_value] = _value
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var CanonicalHeaderNamesMap map[string]string
|
||||||
|
var CanonicalHeaderValuesMap map[string]string
|
||||||
|
|
||||||
|
|
||||||
|
var CanonicalHeaderNames = []string {
|
||||||
|
"Accept",
|
||||||
|
"Accept-CH",
|
||||||
|
"Accept-CH-Lifetime",
|
||||||
|
"Accept-Charset",
|
||||||
|
"Accept-Encoding",
|
||||||
|
"Accept-Language",
|
||||||
|
"Accept-Patch",
|
||||||
|
"Accept-Push-Policy",
|
||||||
|
"Accept-Ranges",
|
||||||
|
"Accept-Signature",
|
||||||
|
"Access-Control-Allow-Credentials",
|
||||||
|
"Access-Control-Allow-Headers",
|
||||||
|
"Access-Control-Allow-Methods",
|
||||||
|
"Access-Control-Allow-Origin",
|
||||||
|
"Access-Control-Expose-Headers",
|
||||||
|
"Access-Control-Max-Age",
|
||||||
|
"Access-Control-Request-Headers",
|
||||||
|
"Access-Control-Request-Method",
|
||||||
|
"Age",
|
||||||
|
"Allow",
|
||||||
|
"Alt-Svc",
|
||||||
|
"Authorization",
|
||||||
|
"Cache-Control",
|
||||||
|
"Clear-Site-Data",
|
||||||
|
"Connection",
|
||||||
|
"Content-DPR",
|
||||||
|
"Content-Disposition",
|
||||||
|
"Content-Encoding",
|
||||||
|
"Content-Id",
|
||||||
|
"Content-Language",
|
||||||
|
"Content-Length",
|
||||||
|
"Content-Location",
|
||||||
|
"Content-Range",
|
||||||
|
"Content-Security-Policy",
|
||||||
|
"Content-Security-Policy-Report-Only",
|
||||||
|
"Content-Transfer-Encoding",
|
||||||
|
"Content-Type",
|
||||||
|
"Cookie",
|
||||||
|
"Cross-Origin-Resource-Policy",
|
||||||
|
"DNT",
|
||||||
|
"DPR",
|
||||||
|
"Date",
|
||||||
|
"ETag",
|
||||||
|
"Early-Data",
|
||||||
|
"Expect",
|
||||||
|
"Expect-CT",
|
||||||
|
"Expires",
|
||||||
|
"Feature-Policy",
|
||||||
|
"Forwarded",
|
||||||
|
"From",
|
||||||
|
"Host",
|
||||||
|
"If-Match",
|
||||||
|
"If-Modified-Since",
|
||||||
|
"If-None-Match",
|
||||||
|
"If-Range",
|
||||||
|
"If-Unmodified-Since",
|
||||||
|
"Index",
|
||||||
|
"Keep-Alive",
|
||||||
|
"Large-Allocation",
|
||||||
|
"Last-Event-ID",
|
||||||
|
"Last-Modified",
|
||||||
|
"Link",
|
||||||
|
"Location",
|
||||||
|
"Max-Forwards",
|
||||||
|
"NEL",
|
||||||
|
"Origin",
|
||||||
|
"Ping-From",
|
||||||
|
"Ping-To",
|
||||||
|
"Pragma",
|
||||||
|
"Proxy-Authenticate",
|
||||||
|
"Proxy-Authorization",
|
||||||
|
"Public-Key-Pins",
|
||||||
|
"Public-Key-Pins-Report-Only",
|
||||||
|
"Push-Policy",
|
||||||
|
"Range",
|
||||||
|
"Referer",
|
||||||
|
"Referrer-Policy",
|
||||||
|
"Report-To",
|
||||||
|
"Retry-After",
|
||||||
|
"Save-Data",
|
||||||
|
"Sec-WebSocket-Accept",
|
||||||
|
"Sec-WebSocket-Extensions",
|
||||||
|
"Sec-WebSocket-Key",
|
||||||
|
"Sec-WebSocket-Protocol",
|
||||||
|
"Sec-WebSocket-Version",
|
||||||
|
"Server",
|
||||||
|
"Server-Timing",
|
||||||
|
"Set-Cookie",
|
||||||
|
"Signature",
|
||||||
|
"Signed-Headers",
|
||||||
|
"SourceMap",
|
||||||
|
"Strict-Transport-Security",
|
||||||
|
"TE",
|
||||||
|
"Timing-Allow-Origin",
|
||||||
|
"Tk",
|
||||||
|
"Trailer",
|
||||||
|
"Transfer-Encoding",
|
||||||
|
"Upgrade",
|
||||||
|
"Upgrade-Insecure-Requests",
|
||||||
|
"User-Agent",
|
||||||
|
"Vary",
|
||||||
|
"Via",
|
||||||
|
"Viewport-Width",
|
||||||
|
"WWW-Authenticate",
|
||||||
|
"Warning",
|
||||||
|
"Width",
|
||||||
|
"X-Content-Type-Options",
|
||||||
|
"X-DNS-Prefetch-Control",
|
||||||
|
"X-Download-Options",
|
||||||
|
"X-Forwarded-By",
|
||||||
|
"X-Forwarded-For",
|
||||||
|
"X-Forwarded-Host",
|
||||||
|
"X-Forwarded-Proto",
|
||||||
|
"X-Frame-Options",
|
||||||
|
"X-Imforwards",
|
||||||
|
"X-Permitted-Cross-Domain-Policies",
|
||||||
|
"X-Pingback",
|
||||||
|
"X-Powered-By",
|
||||||
|
"X-Requested-With",
|
||||||
|
"X-Robots-Tag",
|
||||||
|
"X-UA-Compatible",
|
||||||
|
"X-XSS-Protection",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var CanonicalHeaderValues = []string {
|
||||||
|
|
||||||
|
"public, immutable, max-age=3600",
|
||||||
|
"no-store, max-age=0",
|
||||||
|
|
||||||
|
"identity",
|
||||||
|
"deflate",
|
||||||
|
"gzip",
|
||||||
|
"br",
|
||||||
|
|
||||||
|
"max-age=31536000",
|
||||||
|
"upgrade-insecure-requests",
|
||||||
|
|
||||||
|
"strict-origin-when-cross-origin",
|
||||||
|
"nosniff",
|
||||||
|
"1; mode=block",
|
||||||
|
"sameorigin",
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func init () {
|
||||||
|
|
||||||
|
|
||||||
|
CanonicalHeaderNamesMap = make (map[string]string, len (CanonicalHeaderNames) * 4)
|
||||||
|
for _, _header := range CanonicalHeaderNames {
|
||||||
|
|
||||||
|
_http := http.CanonicalHeaderKey (_header)
|
||||||
|
_toLower := strings.ToLower (_header)
|
||||||
|
_toUpper := strings.ToUpper (_header)
|
||||||
|
|
||||||
|
if _, _duplicate := CanonicalHeaderNamesMap[strings.ToLower (_header)]; _duplicate {
|
||||||
|
panic (fmt.Sprintf ("[f0dffe23] invalid duplicate header `%s`", _header))
|
||||||
|
}
|
||||||
|
|
||||||
|
CanonicalHeaderNamesMap[_header] = _header
|
||||||
|
CanonicalHeaderNamesMap[_toLower] = _header
|
||||||
|
CanonicalHeaderNamesMap[_toUpper] = _header
|
||||||
|
CanonicalHeaderNamesMap[_http] = _header
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CanonicalHeaderValues = append (CanonicalHeaderValues, MimeTypes ...)
|
||||||
|
|
||||||
|
CanonicalHeaderValuesMap = make (map[string]string, len (CanonicalHeaderValues))
|
||||||
|
for _, _value := range CanonicalHeaderValues {
|
||||||
|
CanonicalHeaderValuesMap[_value] = _value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue