Skip to content
Open
Prev Previous commit
test: cover packed-header fallbacks after materialization
Exercise _hasHeader/_getHeader/_hasBodyHeaders after rawHeaders is
materialized, plus empty name/value binding helpers, so the JS scan
paths stay covered once the C++ buffer is dropped.

Co-authored-by: Yagiz Nizipli <anonrig@users.noreply.github.com>
  • Loading branch information
cursoragent and anonrig committed Aug 18, 2026
commit 37317f2bc3b4a1f611b7846d416513a9655e6553
20 changes: 20 additions & 0 deletions test/parallel/test-http-native-headers.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ function packHeaders(pairs, flags = 0) {
assert.deepStrictEqual(nativeHeadersToArray(packed, 2), ['Host', 'example.com']);
assert.strictEqual(nativeHeadersByteLength(packed), 8);

const emptyName = packHeaders(['', 'value', 'X-Empty', '']);
assert.deepStrictEqual(nativeHeadersToArray(emptyName), ['', 'value', 'X-Empty', '']);
assert.strictEqual(nativeHeadersGet(emptyName, 'x-empty'), '');
assert.strictEqual(nativeHeadersHas(emptyName, ''), true);

const truncated = packed.subarray(0, 14);
assert.strictEqual(nativeHeadersHas(truncated, 'host'), false);
assert.deepStrictEqual(nativeHeadersToArray(truncated), []);
Expand Down Expand Up @@ -116,6 +121,13 @@ const server = http.createServer(common.mustCallAtLeast((req, res) => {
const after = Object.getOwnPropertyDescriptor(req, 'rawHeaders');
assert.strictEqual(after.writable, true);
assert.strictEqual(typeof after.get, 'undefined');
// Fallback scans after the packed buffer is gone.
assert.strictEqual(req._hasHeader('host'), true);
assert.strictEqual(req._hasHeader('x-test'), true);
assert.strictEqual(req._hasHeader('x-missing'), false);
assert.strictEqual(req._getHeader('x-test'), 'one, two');
assert.strictEqual(req._getHeader('x-missing'), undefined);
assert.strictEqual(req._hasBodyHeaders(), false);
res.end('ok');
break;
}
Expand All @@ -135,18 +147,26 @@ const server = http.createServer(common.mustCallAtLeast((req, res) => {
assert.strictEqual(req._hasHeader('transfer-encoding'), true);
req.resume();
req.on('end', common.mustCall(() => {
assert.ok(req.rawHeaders.some((h) => h.toLowerCase() === 'transfer-encoding'));
assert.strictEqual(req._hasBodyHeaders(), true);
assert.strictEqual(req._hasHeader('transfer-encoding'), true);
res.end('ok');
}));
break;
}
case '/te': {
assert.strictEqual(req._hasHeader('te'), true);
assert.strictEqual(req._getHeader('te'), 'trailers');
assert.ok(req.rawHeaders.some((h) => h.toLowerCase() === 'te'));
assert.strictEqual(req._hasHeader('te'), true);
assert.strictEqual(req._getHeader('te'), 'trailers');
res.end('ok');
break;
}
case '/expect': {
assert.strictEqual(req._hasHeader('expect'), true);
assert.strictEqual(req._getHeader('expect'), '100-continue');
assert.ok(req.rawHeaders.some((h) => h.toLowerCase() === 'expect'));
assert.strictEqual(req._hasHeader('expect'), true);
assert.strictEqual(req._getHeader('expect'), '100-continue');
res.end('ok');
Expand Down
Loading