84 lines
2.5 KiB
Go
84 lines
2.5 KiB
Go
package httphead
|
|
|
|
// OctetType desribes character type.
|
|
//
|
|
// From the "Basic Rules" chapter of RFC2616
|
|
// See https://tools.ietf.org/html/rfc2616#section-2.2
|
|
//
|
|
// OCTET = <any 8-bit sequence of data>
|
|
// CHAR = <any US-ASCII character (octets 0 - 127)>
|
|
// UPALPHA = <any US-ASCII uppercase letter "A".."Z">
|
|
// LOALPHA = <any US-ASCII lowercase letter "a".."z">
|
|
// ALPHA = UPALPHA | LOALPHA
|
|
// DIGIT = <any US-ASCII digit "0".."9">
|
|
// CTL = <any US-ASCII control character (octets 0 - 31) and DEL (127)>
|
|
// CR = <US-ASCII CR, carriage return (13)>
|
|
// LF = <US-ASCII LF, linefeed (10)>
|
|
// SP = <US-ASCII SP, space (32)>
|
|
// HT = <US-ASCII HT, horizontal-tab (9)>
|
|
// <"> = <US-ASCII double-quote mark (34)>
|
|
// CRLF = CR LF
|
|
// LWS = [CRLF] 1*( SP | HT )
|
|
//
|
|
// Many HTTP/1.1 header field values consist of words separated by LWS
|
|
// or special characters. These special characters MUST be in a quoted
|
|
// string to be used within a parameter value (as defined in section
|
|
// 3.6).
|
|
//
|
|
// token = 1*<any CHAR except CTLs or separators>
|
|
// separators = "(" | ")" | "<" | ">" | "@"
|
|
// | "," | ";" | ":" | "\" | <">
|
|
// | "/" | "[" | "]" | "?" | "="
|
|
// | "{" | "}" | SP | HT
|
|
type OctetType byte
|
|
|
|
// IsChar reports whether octet is CHAR.
|
|
func (t OctetType) IsChar() bool { return t&octetChar != 0 }
|
|
|
|
// IsControl reports whether octet is CTL.
|
|
func (t OctetType) IsControl() bool { return t&octetControl != 0 }
|
|
|
|
// IsSeparator reports whether octet is separator.
|
|
func (t OctetType) IsSeparator() bool { return t&octetSeparator != 0 }
|
|
|
|
// IsSpace reports whether octet is space (SP or HT).
|
|
func (t OctetType) IsSpace() bool { return t&octetSpace != 0 }
|
|
|
|
// IsToken reports whether octet is token.
|
|
func (t OctetType) IsToken() bool { return t&octetToken != 0 }
|
|
|
|
const (
|
|
octetChar OctetType = 1 << iota
|
|
octetControl
|
|
octetSpace
|
|
octetSeparator
|
|
octetToken
|
|
)
|
|
|
|
// OctetTypes is a table of octets.
|
|
var OctetTypes [256]OctetType
|
|
|
|
func init() {
|
|
for c := 32; c < 256; c++ {
|
|
var t OctetType
|
|
if c <= 127 {
|
|
t |= octetChar
|
|
}
|
|
if 0 <= c && c <= 31 || c == 127 {
|
|
t |= octetControl
|
|
}
|
|
switch c {
|
|
case '(', ')', '<', '>', '@', ',', ';', ':', '"', '/', '[', ']', '?', '=', '{', '}', '\\':
|
|
t |= octetSeparator
|
|
case ' ', '\t':
|
|
t |= octetSpace | octetSeparator
|
|
}
|
|
|
|
if t.IsChar() && !t.IsControl() && !t.IsSeparator() && !t.IsSpace() {
|
|
t |= octetToken
|
|
}
|
|
|
|
OctetTypes[c] = t
|
|
}
|
|
}
|