@Override
  public void onDataFrame(DataFrame frame, ByteBuffer data) {
    notifyIdle(idleListener, false);
    try {
      LOG.debug("Processing {}, {} data bytes", frame, data.remaining());

      if (goAwaySent.get()) {
        LOG.debug("Skipped processing of {}", frame);
        return;
      }

      int streamId = frame.getStreamId();
      IStream stream = streams.get(streamId);
      if (stream == null) {
        RstInfo rstInfo = new RstInfo(streamId, StreamStatus.INVALID_STREAM);
        LOG.debug("Unknown stream {}", rstInfo);
        rst(rstInfo, new Callback.Adapter());
      } else {
        processData(stream, frame, data);
      }
    } finally {
      notifyIdle(idleListener, true);
    }
  }