code: def read_or_raise(reader, n=-1):
      
      data = yield from reader.read(n)
      if not data:
          raise NoDataException("No more data")
      return data
docs: Read a given byte number from Stream. NoDataException is raised if read gives no data
      :param reader: reader adapter
      :param n: number of bytes to read
      :return: bytes read