// peekMessage() reads a message from the buffer, but the bytes are NOT committed. // This means the buffer still thinks the bytes are not read yet. func (this *service) peekMessage(mtype message.MessageType, total int) (message.Message, int, error) { var ( b []byte err error i, n int msg message.Message ) if this.in == nil { return nil, 0, ErrBufferNotReady } // Peek until we get total bytes for i = 0; ; i++ { // Peek remlen bytes from the input buffer. b, err = this.in.ReadWait(total) if err != nil && err != ErrBufferInsufficientData { return nil, 0, err } // If not enough bytes are returned, then continue until there's enough. if len(b) >= total { break } } msg, err = mtype.New() if err != nil { return nil, 0, err } n, err = msg.Decode(b) return msg, n, err }
// readMessage() reads and copies a message from the buffer. The buffer bytes are // committed as a result of the read. func (this *service) readMessage(mtype message.MessageType, total int) (message.Message, int, error) { var ( b []byte err error n int msg message.Message ) if this.in == nil { err = ErrBufferNotReady return nil, 0, err } if len(this.intmp) < total { this.intmp = make([]byte, total) } // Read until we get total bytes l := 0 for l < total { n, err = this.in.Read(this.intmp[l:]) l += n glog.Debugf("read %d bytes, total %d", n, l) if err != nil { return nil, 0, err } } b = this.intmp[:total] msg, err = mtype.New() if err != nil { return msg, 0, err } n, err = msg.Decode(b) return msg, n, err }