@Override public void reset(ResetFrame frame, Callback callback) { if (isReset()) return; localReset = true; session.frames(this, callback, frame, Frame.EMPTY_ARRAY); }
@Override public boolean onIdleExpired() { boolean idle = isFillInterested(); if (idle) { boolean close = session.onIdleTimeout(); if (close) session.close(ErrorCode.NO_ERROR.code, "idle_timeout", Callback.NOOP); } return false; }
@Override public void data(DataFrame frame, Callback callback) { if (startWrite(callback)) session.data(this, this, frame); }
@Override public void onOpen() { Map<Integer, Integer> settings = listener.onPreface(getSession()); if (settings == null) settings = new HashMap<>(); settings.computeIfAbsent(SettingsFrame.INITIAL_WINDOW_SIZE, k -> client.getInitialStreamRecvWindow()); settings.computeIfAbsent(SettingsFrame.MAX_CONCURRENT_STREAMS, k -> client.getMaxConcurrentPushedStreams()); Integer maxFrameLength = settings.get(SettingsFrame.MAX_FRAME_SIZE); if (maxFrameLength != null) getParser().setMaxFrameLength(maxFrameLength); PrefaceFrame prefaceFrame = new PrefaceFrame(); SettingsFrame settingsFrame = new SettingsFrame(settings, false); ISession session = getSession(); int windowDelta = client.getInitialSessionRecvWindow() - FlowControlStrategy.DEFAULT_WINDOW_SIZE; if (windowDelta > 0) { session.updateRecvWindow(windowDelta); session.frames(null, this, prefaceFrame, settingsFrame, new WindowUpdateFrame(0, windowDelta)); } else { session.frames(null, this, prefaceFrame, settingsFrame); } }
int sessionWindow = session.updateRecvWindow(0); Atomics.updateMax(maxSessionRecvWindow, sessionWindow);
for (Stream stream : session.getStreams()) session.onWindowUpdate((IStream)stream, new WindowUpdateFrame(stream.getId(), delta));
session.close(ErrorCode.FLOW_CONTROL_ERROR.code, "stream_window_exceeded", Callback.NOOP); callback.failed(new IOException("stream_window_exceeded")); return; session.removeStream(this);
@Override public void onFlushed(long bytes) throws IOException { session.onFlushed(bytes); }
@Override public void close() { // We don't call super from here, otherwise we close the // endPoint and we're not able to read or write anymore. session.close(ErrorCode.NO_ERROR.code, "close", Callback.NOOP); }
@Override public void onData(DataFrame frame) { NetworkBuffer networkBuffer = producer.networkBuffer; networkBuffer.retain(); Callback callback = networkBuffer; session.onData(frame, callback); }
@Override public long getBytesOut() { return session.getBytesWritten(); }
public boolean onSessionTimeout(Throwable failure) { ISession session = getSession(); // Compute whether all requests are idle. boolean result = session.getStreams().stream() .map(stream -> (IStream)stream) .map(stream -> (HttpChannelOverHTTP2)stream.getAttachment()) .filter(Objects::nonNull) .map(HttpChannelOverHTTP2::isRequestIdle) .reduce(true, Boolean::logicalAnd); if (LOG.isDebugEnabled()) LOG.debug("{} idle timeout on {}: {}", result ? "Processed" : "Ignored", session, failure); return result; }
session.onShutdown(); return null;
session.updateRecvWindow(level); if (LOG.isDebugEnabled()) LOG.debug("Data consumed, {} bytes, updated session recv window by {}/{} for {}", length, level, maxLevel, session); session.frames(null, Callback.NOOP, new WindowUpdateFrame(0, level), Frame.EMPTY_ARRAY); if (LOG.isDebugEnabled()) LOG.debug("Data consumed, {} bytes, updated stream recv window by {}/{} for {}", length, level, maxLevel, stream); session.frames(stream, Callback.NOOP, new WindowUpdateFrame(stream.getId(), level), Frame.EMPTY_ARRAY);
@Override public void onDataReceived(ISession session, IStream stream, int length) { int oldSize = session.updateRecvWindow(-length); if (LOG.isDebugEnabled()) LOG.debug("Data received, {} bytes, updated session recv window {} -> {} for {}", length, oldSize, oldSize - length, session); if (stream != null) { oldSize = stream.updateRecvWindow(-length); if (LOG.isDebugEnabled()) LOG.debug("Data received, {} bytes, updated stream recv window {} -> {} for {}", length, oldSize, oldSize - length, stream); } }
for (Stream stream : session.getStreams()) session.onWindowUpdate((IStream)stream, new WindowUpdateFrame(stream.getId(), delta));
session.close(ErrorCode.FLOW_CONTROL_ERROR.code, "stream_window_exceeded", Callback.NOOP); callback.failed(new IOException("stream_window_exceeded")); return; session.removeStream(this);
@Override public void onFlushed(long bytes) throws IOException { session.onFlushed(bytes); }
@Override public void close() { // We don't call super from here, otherwise we close the // endPoint and we're not able to read or write anymore. session.close(ErrorCode.NO_ERROR.code, "close", Callback.NOOP); }
@Override public void onData(DataFrame frame) { NetworkBuffer networkBuffer = producer.networkBuffer; networkBuffer.retain(); Callback callback = networkBuffer; session.onData(frame, callback); }