99 ObjectKeys,
1010 Set,
1111 String,
12+ StringFromCharCode,
13+ StringPrototypeToLowerCase,
1214 Symbol,
1315} = primordials ;
1416
@@ -25,11 +27,14 @@ const {
2527 hideStackFrames
2628} = require ( 'internal/errors' ) ;
2729
30+ const kSensitiveHeaders = Symbol ( 'nodejs.http2.sensitiveHeaders' ) ;
2831const kSocket = Symbol ( 'socket' ) ;
2932const kProxySocket = Symbol ( 'proxySocket' ) ;
3033const kRequest = Symbol ( 'request' ) ;
3134
3235const {
36+ NGHTTP2_NV_FLAG_NONE ,
37+ NGHTTP2_NV_FLAG_NO_INDEX ,
3338 NGHTTP2_SESSION_CLIENT ,
3439 NGHTTP2_SESSION_SERVER ,
3540
@@ -454,6 +459,9 @@ const assertValidPseudoHeaderTrailer = hideStackFrames((key) => {
454459 throw new ERR_HTTP2_INVALID_PSEUDOHEADER ( key ) ;
455460} ) ;
456461
462+ const emptyArray = [ ] ;
463+ const kNeverIndexFlag = StringFromCharCode ( NGHTTP2_NV_FLAG_NO_INDEX ) ;
464+ const kNoHeaderFlags = StringFromCharCode ( NGHTTP2_NV_FLAG_NONE ) ;
457465function mapToHeaders ( map ,
458466 assertValuePseudoHeader = assertValidPseudoHeader ) {
459467 let ret = '' ;
@@ -466,6 +474,8 @@ function mapToHeaders(map,
466474 let value ;
467475 let isSingleValueHeader ;
468476 let err ;
477+ const neverIndex =
478+ ( map [ kSensitiveHeaders ] || emptyArray ) . map ( StringPrototypeToLowerCase ) ;
469479 for ( i = 0 ; i < keys . length ; ++ i ) {
470480 key = keys [ i ] ;
471481 value = map [ key ] ;
@@ -494,11 +504,12 @@ function mapToHeaders(map,
494504 throw new ERR_HTTP2_HEADER_SINGLE_VALUE ( key ) ;
495505 singles . add ( key ) ;
496506 }
507+ const flags = neverIndex . includes ( key ) ? kNeverIndexFlag : kNoHeaderFlags ;
497508 if ( key [ 0 ] === ':' ) {
498509 err = assertValuePseudoHeader ( key ) ;
499510 if ( err !== undefined )
500511 throw err ;
501- ret = `${ key } \0${ value } \0${ ret } ` ;
512+ ret = `${ key } \0${ value } \0${ flags } ${ ret } ` ;
502513 count ++ ;
503514 continue ;
504515 }
@@ -508,12 +519,12 @@ function mapToHeaders(map,
508519 if ( isArray ) {
509520 for ( j = 0 ; j < value . length ; ++ j ) {
510521 const val = String ( value [ j ] ) ;
511- ret += `${ key } \0${ val } \0` ;
522+ ret += `${ key } \0${ val } \0${ flags } ` ;
512523 }
513524 count += value . length ;
514525 continue ;
515526 }
516- ret += `${ key } \0${ value } \0` ;
527+ ret += `${ key } \0${ value } \0${ flags } ` ;
517528 count ++ ;
518529 }
519530
@@ -552,7 +563,7 @@ const assertWithinRange = hideStackFrames(
552563 }
553564) ;
554565
555- function toHeaderObject ( headers ) {
566+ function toHeaderObject ( headers , sensitiveHeaders ) {
556567 const obj = ObjectCreate ( null ) ;
557568 for ( var n = 0 ; n < headers . length ; n += 2 ) {
558569 const name = headers [ n ] ;
@@ -593,6 +604,7 @@ function toHeaderObject(headers) {
593604 }
594605 }
595606 }
607+ obj [ kSensitiveHeaders ] = sensitiveHeaders ;
596608 return obj ;
597609}
598610
@@ -621,6 +633,7 @@ module.exports = {
621633 getSettings,
622634 getStreamState,
623635 isPayloadMeaningless,
636+ kSensitiveHeaders,
624637 kSocket,
625638 kProxySocket,
626639 kRequest,
0 commit comments