code: def __read_response(self, nblines=-1):
          
          resp, code, data = (b"", None, None)
          cpt = 0
          while True:
              try:
                  line = self.__read_line()
              except Response as inst:
                  code = inst.code
                  data = inst.data
                  break
              except Literal as inst:
                  resp += self.__read_block(inst.value)
                  if not resp.endswith(CRLF):
                      resp += self.__read_line() + CRLF
                  continue
              if not len(line):
                  continue
              resp += line + CRLF
              cpt += 1
              if nblines != -1 and cpt == nblines:
                  break
  
          return (code, data, resp)
docs: Read a response from the server.
  
          In the usual case, we read lines until we find one that looks
          like a response (OK|NO|BYE\s*(.+)?).
  
          If *nblines* > 0, we read excactly nblines before returning.
  
          :param nblines: number of lines to read (default : -1)
          :rtype: tuple
          :return: a tuple of the form (code, data, response). If
          nblines is provided, code and data can be equal to None.