docs: public void run() {
          try {
              final byte[] buffer = new byte[512 * 1024];
              while (!this.closed.get()) {
                  //
                  int r = this.is.read(buffer, 0, buffer.length);
                  if (r < 0) throw new EOFException();
  
                  //
                  int offset = 0;
                  while (r > 0) {
                      final int w = write(buffer, offset, r);
                      r -= w;
                      offset += w;
                  }
              }
          } catch (IOException e) {
              this.exception = e;
          } catch (Exception e) {
              logger.error("failed to transfer data", e);
          } finally {
              if (!this.closed.get()) {
                  try {
                      close();
                  } catch (IOException e) {
                      logger.error("failed to close is", e);
                  }
              }
          }
      }