docs: def Read(self, length=None):
      """Reads data."""
  
      if length is None:
        length = self._length - self._offset
  
      if length > self._max_unbound_read:
        raise OversizedReadError("Attempted to read %d bytes when "
                                 "Server.max_unbound_read_size is %d" %
                                 (length, self._max_unbound_read))
  
      result = io.BytesIO()
      while result.tell() < length:
        chunk, ref = self._GetChunk()
        if not chunk:
          break
  
        part = chunk[self._offset - ref.offset:]
        if not part:
          break
  
        result.write(part)
        self._offset += min(length, len(part))
  
      return result.getvalue()[:length]