case '$':
n, err := parseLen(line[1:])
if n < 0 || err != nil {
return nil, err
}
line, err = conn.readLine()
if err != nil {
return nil, err
}
if len(line) != n {
return nil, errors.New("invalid response")
}
// readLine read a single line terminated with CRLF.
func (conn *redisConn) readLine() ([]byte, error) {
var line []byte
for {
p, err := conn.br.ReadBytes('\n')
if err != nil {
return nil, err
}
n := len(p) - 2
if n < 0 {
return nil, errors.New("invalid response")
}
// bulk string may contain '\n', such as CLUSTER NODES
if p[n] != '\r' {
if line != nil {
line = append(line, p[:]...)
} else {
line = p
}
continue
}
if line != nil {
return append(line, p[:n]...), nil
} else {
return p[:n], nil
}
}
}