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