http2: set Http2Stream#sentHeaders for raw headers · nodejs/node@0fb005a

@@ -254,6 +254,7 @@ const kProceed = Symbol('proceed');

254254

const kRemoteSettings = Symbol('remote-settings');

255255

const kRequestAsyncResource = Symbol('requestAsyncResource');

256256

const kSentHeaders = Symbol('sent-headers');

257+

const kRawHeaders = Symbol('raw-headers');

257258

const kSentTrailers = Symbol('sent-trailers');

258259

const kServer = Symbol('server');

259260

const kState = Symbol('state');

@@ -1807,12 +1808,14 @@ class ClientHttp2Session extends Http2Session {

1807180818081809

let headersList;

18091810

let headersObject;

1811+

let rawHeaders;

18101812

let scheme;

18111813

let authority;

18121814

let method;

1813181518141816

if (ArrayIsArray(headersParam)) {

18151817

({

1818+

rawHeaders,

18161819

headersList,

18171820

scheme,

18181821

authority,

@@ -1859,6 +1862,7 @@ class ClientHttp2Session extends Http2Session {

18591862

// eslint-disable-next-line no-use-before-define

18601863

const stream = new ClientHttp2Stream(this, undefined, undefined, {});

18611864

stream[kSentHeaders] = headersObject; // N.b. Only set for object headers, not raw headers

1865+

stream[kRawHeaders] = rawHeaders; // N.b. Only set for raw headers, not object headers

18621866

stream[kOrigin] = `${scheme}://${authority}`;

18631867

const reqAsync = new AsyncResource('PendingRequest');

18641868

stream[kRequestAsyncResource] = reqAsync;

@@ -2128,6 +2132,33 @@ class Http2Stream extends Duplex {

21282132

}

2129213321302134

get sentHeaders() {

2135+

if (this[kSentHeaders] || !this[kRawHeaders]) {

2136+

return this[kSentHeaders];

2137+

}

2138+2139+

const rawHeaders = this[kRawHeaders];

2140+

const headersObject = { __proto__: null };

2141+2142+

for (let i = 0; i < rawHeaders.length; i += 2) {

2143+

const key = rawHeaders[i];

2144+

const value = rawHeaders[i + 1];

2145+2146+

const existing = headersObject[key];

2147+

if (existing === undefined) {

2148+

headersObject[key] = value;

2149+

} else if (ArrayIsArray(existing)) {

2150+

existing.push(value);

2151+

} else {

2152+

headersObject[key] = [existing, value];

2153+

}

2154+

}

2155+2156+

if (rawHeaders[kSensitiveHeaders] !== undefined) {

2157+

headersObject[kSensitiveHeaders] = rawHeaders[kSensitiveHeaders];

2158+

}

2159+2160+

this[kSentHeaders] = headersObject;

2161+21312162

return this[kSentHeaders];

21322163

}

21332164