private void goAway(SessionStatus sessionStatus, long timeout, TimeUnit unit, Callback callback) { if (goAwaySent.compareAndSet(false, true)) { if (!goAwayReceived.get()) { GoAwayFrame frame = new GoAwayFrame(version, lastStreamId.get(), sessionStatus.getCode()); control(null, frame, timeout, unit, callback); return; } } complete(callback); }
@Override public void rst(RstInfo rstInfo, Callback callback) { // SPEC v3, 2.2.2 if (goAwaySent.get()) { complete(callback); } else { int streamId = rstInfo.getStreamId(); IStream stream = streams.get(streamId); RstStreamFrame frame = new RstStreamFrame(version, streamId, rstInfo.getStreamStatus().getCode(version)); control(stream, frame, rstInfo.getTimeout(), rstInfo.getUnit(), callback); if (stream != null) { stream.process(frame); removeStream(stream); } } }