2021-12-04 16:42:11 +00:00

175 lines
2.8 KiB
Go

// Copyright 2020 lesismal. All rights reserved.
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.
package nbhttp
import "strings"
var (
validMethods = map[string]bool{
"OPTIONS": true,
"GET": true,
"HEAD": true,
"POST": true,
"PUT": true,
"DELETE": true,
"TRACE": true,
"CONNECT": true,
// http 2.0
"PRI": true,
}
tokenCharMap = [256]bool{
'!': true,
'#': true,
'$': true,
'%': true,
'&': true,
'\'': true,
'*': true,
'+': true,
'-': true,
'.': true,
'0': true,
'1': true,
'2': true,
'3': true,
'4': true,
'5': true,
'6': true,
'7': true,
'8': true,
'9': true,
'A': true,
'B': true,
'C': true,
'D': true,
'E': true,
'F': true,
'G': true,
'H': true,
'I': true,
'J': true,
'K': true,
'L': true,
'M': true,
'N': true,
'O': true,
'P': true,
'Q': true,
'R': true,
'S': true,
'T': true,
'U': true,
'W': true,
'V': true,
'X': true,
'Y': true,
'Z': true,
'^': true,
'_': true,
'`': true,
'a': true,
'b': true,
'c': true,
'd': true,
'e': true,
'f': true,
'g': true,
'h': true,
'i': true,
'j': true,
'k': true,
'l': true,
'm': true,
'n': true,
'o': true,
'p': true,
'q': true,
'r': true,
's': true,
't': true,
'u': true,
'v': true,
'w': true,
'x': true,
'y': true,
'z': true,
'|': true,
'~': true,
}
// headerCharMap = [256]bool{}.
numCharMap = [256]bool{}
hexCharMap = [256]bool{}
alphaCharMap = [256]bool{}
alphaNumCharMap = [256]bool{}
validMethodCharMap = [256]bool{}
)
func init() {
var dis byte = 'a' - 'A'
for m := range validMethods {
for _, c := range m {
validMethodCharMap[c] = true
validMethodCharMap[byte(c)+dis] = true
}
}
for i := byte(0); i < 10; i++ {
numCharMap['0'+i] = true
alphaNumCharMap['0'+i] = true
hexCharMap['0'+i] = true
}
for i := byte(0); i < 6; i++ {
hexCharMap['A'+i] = true
hexCharMap['a'+i] = true
}
for i := byte(0); i < 26; i++ {
alphaCharMap['A'+i] = true
alphaCharMap['A'+i+dis] = true
alphaNumCharMap['A'+i] = true
alphaNumCharMap['A'+i+dis] = true
}
// for i := 0; i < len(tokenCharMap); i++ {
// headerCharMap[i] = tokenCharMap[i]
// }
// headerCharMap[':'] = true
// headerCharMap['?'] = true
}
func isAlpha(c byte) bool {
return alphaCharMap[c]
}
func isNum(c byte) bool {
return numCharMap[c]
}
func isHex(c byte) bool {
return hexCharMap[c]
}
// func isAlphaNum(c byte) bool {
// return alphaNumCharMap[c]
// }
func isToken(c byte) bool {
return tokenCharMap[c]
}
func isValidMethod(m string) bool {
return validMethods[strings.ToUpper(m)]
}
func isValidMethodChar(c byte) bool {
return validMethodCharMap[c]
}