@@ -192,6 +192,9 @@ const IDX_SETTINGS_MAX_HEADER_LIST_SIZE = 5;
192192const IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL = 6 ;
193193const IDX_SETTINGS_FLAGS = 7 ;
194194
195+ // Maximum number of allowed additional settings
196+ const MAX_ADDITIONAL_SETTINGS = 10 ;
197+
195198const IDX_SESSION_STATE_EFFECTIVE_LOCAL_WINDOW_SIZE = 0 ;
196199const IDX_SESSION_STATE_EFFECTIVE_RECV_DATA_LENGTH = 1 ;
197200const IDX_SESSION_STATE_NEXT_STREAM_ID = 2 ;
@@ -350,6 +353,65 @@ function getSettings(session, remote) {
350353
351354function updateSettingsBuffer ( settings ) {
352355 let flags = 0 ;
356+
357+ if ( typeof settings . customSettings === 'object' ) {
358+ let customSettings = settings . customSettings ;
359+ let numCustomSettings = 0 ;
360+ for ( const setting in customSettings ) {
361+ const val = customSettings [ setting ] ;
362+ if ( typeof setting === 'number' && typeof val === 'number' ) {
363+ let set = false
364+ if ( setting < IDX_SETTINGS_FLAGS ) {
365+ set = true
366+ switch ( setting ) {
367+ case IDX_SETTINGS_HEADER_TABLE_SIZE :
368+ flags |= ( 1 << IDX_SETTINGS_HEADER_TABLE_SIZE ) ;
369+ settingsBuffer [ IDX_SETTINGS_HEADER_TABLE_SIZE ] =
370+ val ;
371+ break ;
372+ case IDX_SETTINGS_ENABLE_PUSH :
373+ flags |= ( 1 << IDX_SETTINGS_ENABLE_PUSH ) ;
374+ settingsBuffer [ IDX_SETTINGS_ENABLE_PUSH ] = val ;
375+ break ;
376+ case IDX_SETTINGS_INITIAL_WINDOW_SIZE :
377+ flags |= ( 1 << IDX_SETTINGS_INITIAL_WINDOW_SIZE ) ;
378+ settingsBuffer [ IDX_SETTINGS_INITIAL_WINDOW_SIZE ] =
379+ val ;
380+ break ;
381+ case IDX_SETTINGS_MAX_FRAME_SIZE :
382+ flags |= ( 1 << IDX_SETTINGS_MAX_FRAME_SIZE ) ;
383+ settingsBuffer [ IDX_SETTINGS_MAX_FRAME_SIZE ] =
384+ val ;
385+ break ;
386+ case IDX_SETTINGS_MAX_CONCURRENT_STREAMS :
387+ flags |= ( 1 << IDX_SETTINGS_MAX_CONCURRENT_STREAMS ) ;
388+ settingsBuffer [ IDX_SETTINGS_MAX_CONCURRENT_STREAMS ] = val ;
389+ break ;
390+ case IDX_SETTINGS_MAX_HEADER_LIST_SIZE :
391+ flags |= ( 1 << IDX_SETTINGS_MAX_HEADER_LIST_SIZE ) ;
392+ settingsBuffer [ IDX_SETTINGS_MAX_HEADER_LIST_SIZE ] =
393+ val ;
394+ break ;
395+ case IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL :
396+ flags |= ( 1 << IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL ) ;
397+ settingsBuffer [ IDX_SETTINGS_ENABLE_CONNECT_PROTOCOL ] = val ;
398+ break ;
399+ default :
400+ set = false ;
401+ break ;
402+ }
403+ }
404+ if ( ! set ) { // not supported
405+ if ( numCustomSettings === MAX_ADDITIONAL_SETTINGS ) throw new Error ( 'Number of custom settings exceeds MAX_ADDITIONAL_SETTINGS' ) ;
406+ settingsBuffer [ IDX_SETTINGS_FLAGS + 1 + 2 * numCustomSettings ] = setting ;
407+ settingsBuffer [ IDX_SETTINGS_FLAGS + 1 + 2 * numCustomSettings + 1 ] = val ;
408+ numCustomSettings ++ ;
409+ }
410+ }
411+ settingsBuffer [ IDX_SETTINGS_FLAGS + 1 ] = numCustomSettings ;
412+ }
413+ }
414+
353415 if ( typeof settings . headerTableSize === 'number' ) {
354416 flags |= ( 1 << IDX_SETTINGS_HEADER_TABLE_SIZE ) ;
355417 settingsBuffer [ IDX_SETTINGS_HEADER_TABLE_SIZE ] =
0 commit comments