9
9
ObjectKeys,
10
10
Set,
11
11
String,
12
+ StringFromCharCode,
13
+ StringPrototypeToLowerCase,
12
14
Symbol,
13
15
} = primordials ;
14
16
@@ -25,11 +27,14 @@ const {
25
27
hideStackFrames
26
28
} = require ( 'internal/errors' ) ;
27
29
30
+ const kSensitiveHeaders = Symbol ( 'nodejs.http2.sensitiveHeaders' ) ;
28
31
const kSocket = Symbol ( 'socket' ) ;
29
32
const kProxySocket = Symbol ( 'proxySocket' ) ;
30
33
const kRequest = Symbol ( 'request' ) ;
31
34
32
35
const {
36
+ NGHTTP2_NV_FLAG_NONE ,
37
+ NGHTTP2_NV_FLAG_NO_INDEX ,
33
38
NGHTTP2_SESSION_CLIENT ,
34
39
NGHTTP2_SESSION_SERVER ,
35
40
@@ -454,6 +459,9 @@ const assertValidPseudoHeaderTrailer = hideStackFrames((key) => {
454
459
throw new ERR_HTTP2_INVALID_PSEUDOHEADER ( key ) ;
455
460
} ) ;
456
461
462
+ const emptyArray = [ ] ;
463
+ const kNeverIndexFlag = StringFromCharCode ( NGHTTP2_NV_FLAG_NO_INDEX ) ;
464
+ const kNoHeaderFlags = StringFromCharCode ( NGHTTP2_NV_FLAG_NONE ) ;
457
465
function mapToHeaders ( map ,
458
466
assertValuePseudoHeader = assertValidPseudoHeader ) {
459
467
let ret = '' ;
@@ -466,6 +474,8 @@ function mapToHeaders(map,
466
474
let value ;
467
475
let isSingleValueHeader ;
468
476
let err ;
477
+ const neverIndex =
478
+ ( map [ kSensitiveHeaders ] || emptyArray ) . map ( StringPrototypeToLowerCase ) ;
469
479
for ( i = 0 ; i < keys . length ; ++ i ) {
470
480
key = keys [ i ] ;
471
481
value = map [ key ] ;
@@ -494,11 +504,12 @@ function mapToHeaders(map,
494
504
throw new ERR_HTTP2_HEADER_SINGLE_VALUE ( key ) ;
495
505
singles . add ( key ) ;
496
506
}
507
+ const flags = neverIndex . includes ( key ) ? kNeverIndexFlag : kNoHeaderFlags ;
497
508
if ( key [ 0 ] === ':' ) {
498
509
err = assertValuePseudoHeader ( key ) ;
499
510
if ( err !== undefined )
500
511
throw err ;
501
- ret = `${ key } \0${ value } \0${ ret } ` ;
512
+ ret = `${ key } \0${ value } \0${ flags } ${ ret } ` ;
502
513
count ++ ;
503
514
continue ;
504
515
}
@@ -508,12 +519,12 @@ function mapToHeaders(map,
508
519
if ( isArray ) {
509
520
for ( j = 0 ; j < value . length ; ++ j ) {
510
521
const val = String ( value [ j ] ) ;
511
- ret += `${ key } \0${ val } \0` ;
522
+ ret += `${ key } \0${ val } \0${ flags } ` ;
512
523
}
513
524
count += value . length ;
514
525
continue ;
515
526
}
516
- ret += `${ key } \0${ value } \0` ;
527
+ ret += `${ key } \0${ value } \0${ flags } ` ;
517
528
count ++ ;
518
529
}
519
530
@@ -552,7 +563,7 @@ const assertWithinRange = hideStackFrames(
552
563
}
553
564
) ;
554
565
555
- function toHeaderObject ( headers ) {
566
+ function toHeaderObject ( headers , sensitiveHeaders ) {
556
567
const obj = ObjectCreate ( null ) ;
557
568
for ( var n = 0 ; n < headers . length ; n += 2 ) {
558
569
const name = headers [ n ] ;
@@ -593,6 +604,7 @@ function toHeaderObject(headers) {
593
604
}
594
605
}
595
606
}
607
+ obj [ kSensitiveHeaders ] = sensitiveHeaders ;
596
608
return obj ;
597
609
}
598
610
@@ -621,6 +633,7 @@ module.exports = {
621
633
getSettings,
622
634
getStreamState,
623
635
isPayloadMeaningless,
636
+ kSensitiveHeaders,
624
637
kSocket,
625
638
kProxySocket,
626
639
kRequest,
0 commit comments