code: void pushDataLater(final int streamId, final BufferedSource source, final int byteCount,
        final boolean inFinished) throws IOException {
      final Buffer buffer = new Buffer();
      source.require(byteCount); // Eagerly read the frame before firing client thread.
      source.read(buffer, byteCount);
      if (buffer.size() != byteCount) throw new IOException(buffer.size() + " != " + byteCount);
      pushExecutorExecute(new NamedRunnable("OkHttp %s Push Data[%s]", connectionName, streamId) {
        @Override public void execute() {
          try {
            boolean cancel = pushObserver.onData(streamId, buffer, byteCount, inFinished);
            if (cancel) writer.rstStream(streamId, ErrorCode.CANCEL);
            if (cancel || inFinished) {
              synchronized (Http2Connection.this) {
                currentPushRequests.remove(streamId);
              }
            }
          } catch (IOException ignored) {
          }
        }
      });
    }
docs: Eagerly reads {@code byteCount} bytes from the source before launching a background task to
  process the data.  This avoids corrupting the stream.