@Override protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) { frameRef.set(new SettingsFrame(settings, false)); return true; }
@Override public int generate(ByteBufferPool.Lease lease, Frame frame) { SettingsFrame settingsFrame = (SettingsFrame)frame; return generateSettings(lease, settingsFrame.getSettings(), settingsFrame.isReply()); }
LOG.debug("Received {}", frame); if (frame.isReply()) return; for (Map.Entry<Integer, Integer> entry : frame.getSettings().entrySet()) SettingsFrame replyFrame = new SettingsFrame(Collections.emptyMap(), true); settings(replyFrame, Callback.NOOP);
@Override public void onSettings(Session session, SettingsFrame frame) { Map<Integer, Integer> settings = frame.getSettings(); if (settings.containsKey(SettingsFrame.MAX_CONCURRENT_STREAMS)) destination().setMaxRequestsPerConnection(settings.get(SettingsFrame.MAX_CONCURRENT_STREAMS)); if (!connection.isMarked()) onServerPreface(session); }
LOG.debug("Received {}", frame); if (frame.isReply()) return; for (Map.Entry<Integer, Integer> entry : frame.getSettings().entrySet()) SettingsFrame replyFrame = new SettingsFrame(Collections.emptyMap(), true); settings(replyFrame, Callback.NOOP);
Integer initialWindow = settingsFrame.getSettings().get(SettingsFrame.INITIAL_WINDOW_SIZE); if (initialWindow != null) flowControl.updateInitialStreamWindow(HTTP2Session.this, initialWindow, true);
@Override protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) { frameRef.set(new SettingsFrame(settings, false)); return true; }
@Override public int generate(ByteBufferPool.Lease lease, Frame frame) { SettingsFrame settingsFrame = (SettingsFrame)frame; return generateSettings(lease, settingsFrame.getSettings(), settingsFrame.isReply()); }
Integer initialWindow = settingsFrame.getSettings().get(SettingsFrame.INITIAL_WINDOW_SIZE); if (initialWindow != null) flowControl.updateInitialStreamWindow(HTTP2Session.this, initialWindow, true);
protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) frameRef.set(new SettingsFrame(settings, false)); return true;
protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) frameRef.set(new SettingsFrame(settings, false)); return true;
protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) { Integer enablePush = settings.get(SettingsFrame.ENABLE_PUSH); if (enablePush != null && enablePush != 0 && enablePush != 1) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_enable_push"); Integer initialWindowSize = settings.get(SettingsFrame.INITIAL_WINDOW_SIZE); // Values greater than Integer.MAX_VALUE will overflow to negative. if (initialWindowSize != null && initialWindowSize < 0) return connectionFailure(buffer, ErrorCode.FLOW_CONTROL_ERROR.code, "invalid_settings_initial_window_size"); Integer maxFrameLength = settings.get(SettingsFrame.MAX_FRAME_SIZE); if (maxFrameLength != null && (maxFrameLength < Frame.DEFAULT_MAX_LENGTH || maxFrameLength > Frame.MAX_MAX_LENGTH)) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_max_frame_size"); SettingsFrame frame = new SettingsFrame(settings, hasFlag(Flags.ACK)); reset(); notifySettings(frame); return true; }
protected boolean onSettings(ByteBuffer buffer, Map<Integer, Integer> settings) { Integer enablePush = settings.get(SettingsFrame.ENABLE_PUSH); if (enablePush != null && enablePush != 0 && enablePush != 1) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_enable_push"); Integer initialWindowSize = settings.get(SettingsFrame.INITIAL_WINDOW_SIZE); // Values greater than Integer.MAX_VALUE will overflow to negative. if (initialWindowSize != null && initialWindowSize < 0) return connectionFailure(buffer, ErrorCode.FLOW_CONTROL_ERROR.code, "invalid_settings_initial_window_size"); Integer maxFrameLength = settings.get(SettingsFrame.MAX_FRAME_SIZE); if (maxFrameLength != null && (maxFrameLength < Frame.DEFAULT_MAX_LENGTH || maxFrameLength > Frame.MAX_MAX_LENGTH)) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_settings_max_frame_size"); SettingsFrame frame = new SettingsFrame(settings, hasFlag(Flags.ACK)); reset(); notifySettings(frame); return true; }
@Override public void onPreface() { // SPEC: send a SETTINGS frame upon receiving the preface. Map<Integer, Integer> settings = notifyPreface(this); if (settings == null) settings = Collections.emptyMap(); SettingsFrame settingsFrame = new SettingsFrame(settings, false); WindowUpdateFrame windowFrame = null; int sessionWindow = getInitialSessionRecvWindow() - FlowControlStrategy.DEFAULT_WINDOW_SIZE; if (sessionWindow > 0) { updateRecvWindow(sessionWindow); windowFrame = new WindowUpdateFrame(0, sessionWindow); } if (windowFrame == null) frames(null, Callback.NOOP, settingsFrame, Frame.EMPTY_ARRAY); else frames(null, Callback.NOOP, settingsFrame, windowFrame); }
@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); } }