http2: set Http2Stream#sentHeaders for raw headers · nodejs/node@0fb005a
@@ -254,6 +254,7 @@ const kProceed = Symbol('proceed');
254254const kRemoteSettings = Symbol('remote-settings');
255255const kRequestAsyncResource = Symbol('requestAsyncResource');
256256const kSentHeaders = Symbol('sent-headers');
257+const kRawHeaders = Symbol('raw-headers');
257258const kSentTrailers = Symbol('sent-trailers');
258259const kServer = Symbol('server');
259260const kState = Symbol('state');
@@ -1807,12 +1808,14 @@ class ClientHttp2Session extends Http2Session {
1807180818081809let headersList;
18091810let headersObject;
1811+let rawHeaders;
18101812let scheme;
18111813let authority;
18121814let method;
1813181518141816if (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
18601863const stream = new ClientHttp2Stream(this, undefined, undefined, {});
18611864stream[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
18621866stream[kOrigin] = `${scheme}://${authority}`;
18631867const reqAsync = new AsyncResource('PendingRequest');
18641868stream[kRequestAsyncResource] = reqAsync;
@@ -2128,6 +2132,33 @@ class Http2Stream extends Duplex {
21282132}
2129213321302134get 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+21312162return this[kSentHeaders];
21322163}
21332164