func readN(rd *bufio.Reader, n int) ([]byte, error) { b, err := rd.ReadN(n) if err == bufio.ErrBufferFull { tmp := make([]byte, n) r := copy(tmp, b) b = tmp for { nn, err := rd.Read(b[r:]) r += nn if r >= n { // Ignore error if we read enough. break } if err != nil { return nil, err } } } else if err != nil { return nil, err } return b, nil }