package token import ( "sourcecode.social/reiver/go-rfc2616/char" "sourcecode.social/reiver/go-rfc2616/ctl" "sourcecode.social/reiver/go-rfc2616/separator" ) // Bytes returns the 'Method', as defiend by IETF RFC-2616. // // Method = "OPTIONS" // | "GET" // | "HEAD" // | "POST" // | "PUT" // | "DELETE" // | "TRACE" // | "CONNECT" // | extension-method // // extension-method = token // // Which, in practice, can be simplified to: // // Method = token // // And 'token' is defined as: // // token = 1* // // CHAR = // // CTL = // // separators = "(" | ")" | "<" | ">" | "@" // | "," | ";" | ":" | "\" | <"> // | "/" | "[" | "]" | "?" | "=" // | "{" | "}" | SP | HT // // SP = // // HT = func Bytes(p []byte) (method []byte, rest []byte, ok bool) { if 0 == len(p) { return nil, nil, false } { p0 := p[0] if !char.ByteIsChar(p0) { return nil, p, false } if separator.ByteIsSeparator(p0) { return nil, p, false } if ctl.ByteIsControlCharacter(p0) { return nil, p, false } } { var i int var b byte for i,b = range p { if !char.ByteIsChar(b) || separator.ByteIsSeparator(b) || ctl.ByteIsControlCharacter(b) { return p[:i], p[i:], true } } return p, nil, true } }