private void readSettings(Handler handler, int flags, int length, int streamId) throws IOException { if (length % 8 != 0) throw ioException("TYPE_SETTINGS length %% 8 != 0: %s", length); if (streamId != 0) throw ioException("TYPE_SETTINGS streamId != 0"); Settings settings = new Settings(); for (int i = 0; i < length; i += 8) { int w1 = in.readInt(); int value = in.readInt(); // int r = (w1 & 0xff000000) >>> 24; // Reserved. int id = w1 & 0xffffff; settings.set(id, 0, value); } handler.settings(false, settings); }
private void readSettings(Handler handler, int length, byte flags, int streamId) throws IOException { if (streamId != 0) throw ioException("TYPE_SETTINGS streamId != 0"); if ((flags & FLAG_ACK) != 0) { if (length != 0) throw ioException("FRAME_SIZE_ERROR ack frame should be empty!"); handler.ackSettings(); return; } if (length % 6 != 0) throw ioException("TYPE_SETTINGS length %% 6 != 0: %s", length); Settings settings = new Settings(); for (int i = 0; i < length; i += 6) { short id = source.readShort(); int value = source.readInt(); switch (id) { case 1: // SETTINGS_HEADER_TABLE_SIZE break; case 2: // SETTINGS_ENABLE_PUSH if (value != 0 && value != 1) { throw ioException("PROTOCOL_ERROR SETTINGS_ENABLE_PUSH != 0 or 1"); } break; case 3: // SETTINGS_MAX_CONCURRENT_STREAMS id = 4; // Renumbered in draft 10. break; case 4: // SETTINGS_INITIAL_WINDOW_SIZE id = 7; // Renumbered in draft 10. if (value < 0) { throw ioException("PROTOCOL_ERROR SETTINGS_INITIAL_WINDOW_SIZE > 2^31 - 1"); } break; case 5: // SETTINGS_MAX_FRAME_SIZE if (value < INITIAL_MAX_FRAME_SIZE || value > 16777215) { throw ioException("PROTOCOL_ERROR SETTINGS_MAX_FRAME_SIZE: %s", value); } break; case 6: // SETTINGS_MAX_HEADER_LIST_SIZE break; // Advisory only, so ignored. default: throw ioException("PROTOCOL_ERROR invalid settings id: %s", id); } settings.set(id, 0, value); } handler.settings(false, settings); if (settings.getHeaderTableSize() >= 0) { hpackReader.headerTableSizeSetting(settings.getHeaderTableSize()); } }