func (p *parser) dispatch(depth int, buf *streambuf.Buffer) (common.NetString, bool, bool, bool) { if buf.Len() == 0 { return empty, false, true, false } var value common.NetString var iserror, ok, complete bool snapshot := buf.Snapshot() switch buf.Bytes()[0] { case '*': value, iserror, ok, complete = p.parseArray(depth, buf) case '$': value, ok, complete = p.parseString(buf) case ':': value, ok, complete = p.parseInt(buf) case '+': value, ok, complete = p.parseSimpleString(buf) case '-': iserror = true value, ok, complete = p.parseSimpleString(buf) default: if isDebug { debugf("Unexpected message starting with %s", buf.Bytes()[0]) } return empty, false, false, false } if !ok || !complete { buf.Restore(snapshot) } return value, iserror, ok, complete }
func doParseCommand(parser *parser, buf *streambuf.Buffer) parseResult { // check if binary + text command and dispatch if !buf.Avail(2) { return parser.needMore() } magic := buf.Bytes()[0] isBinary := magic == memcacheMagicRequest || magic == memcacheMagicResponse if isBinary { return parser.contWith(buf, parseStateBinaryCommand) } return parser.contWith(buf, parseStateTextCommand) }
func parseNoReplyArg(buf *streambuf.Buffer) (bool, error) { debug("parse noreply") err := parseNextArg(buf) if err != nil { return false, textArgError(err) } var noreplyArg = []byte("noreply") noreply := bytes.HasPrefix(buf.Bytes(), noreplyArg) if !noreply { return false, ErrExpectedNoReply } return true, nil }