From f58bc26a4a511a6cfae5069d51662e51f9d1c154 Mon Sep 17 00:00:00 2001 From: Shivay-98 Date: Mon, 22 Jun 2026 22:05:29 +0530 Subject: [PATCH] http2: add headersDistinct to Http2ServerRequest --- lib/internal/http2/compat.js | 25 +++++++++++++++++++ ...test-http2-compat-serverrequest-headers.js | 19 ++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/lib/internal/http2/compat.js b/lib/internal/http2/compat.js index 7b9524ef855988..2861acb923a6c1 100644 --- a/lib/internal/http2/compat.js +++ b/lib/internal/http2/compat.js @@ -71,6 +71,7 @@ const kRawTrailers = Symbol('rawTrailers'); const kSetHeader = Symbol('setHeader'); const kAppendHeader = Symbol('appendHeader'); const kAborted = Symbol('aborted'); +const kHeadersDistinct = Symbol('kHeadersDistinct'); let statusMessageWarned = false; let statusConnectionHeaderWarned = false; @@ -323,6 +324,7 @@ class Http2ServerRequest extends Readable { this[kRawTrailers] = []; this[kStream] = stream; this[kAborted] = false; + this[kHeadersDistinct] = undefined; stream[kProxySocket] = null; stream[kRequest] = this; @@ -356,6 +358,29 @@ class Http2ServerRequest extends Readable { return this[kHeaders]; } + get headersDistinct() { + if (this[kHeadersDistinct] === undefined) { + const distinct = { __proto__: null }; + + const raw = this[kRawHeaders]; + + for (let i = 0; i < raw.length; i += 2) { + const name = String(raw[i]).toLowerCase(); + const value = raw[i + 1]; + + if (distinct[name] === undefined) { + distinct[name] = [value]; + } else { + distinct[name].push(value); + } + } + + this[kHeadersDistinct] = distinct; + } + + return this[kHeadersDistinct]; +} + get rawHeaders() { return this[kRawHeaders]; } diff --git a/test/parallel/test-http2-compat-serverrequest-headers.js b/test/parallel/test-http2-compat-serverrequest-headers.js index 2028e672a7f173..8ddc08efedf3a2 100644 --- a/test/parallel/test-http2-compat-serverrequest-headers.js +++ b/test/parallel/test-http2-compat-serverrequest-headers.js @@ -39,6 +39,25 @@ const h2 = require('http2'); assert.strictEqual(rawHeaders[position + 1], value); } + const headersDistinct = request.headersDistinct; + + assert.deepStrictEqual( + headersDistinct, + { + __proto__: null, + ':path': ['/foobar'], + ':method': ['GET'], + ':scheme': ['http'], + ':authority': [`localhost:${port}`], + 'foo-bar': ['abc123'], + } + ); + + assert.strictEqual( + headersDistinct, + request.headersDistinct + ); + request.url = '/one'; assert.strictEqual(request.url, '/one');