Skip to content

Commit 7c3bcf5

Browse files
committed
http: allow passing array of key/val into writeHead
Enables an optimization when the user already has the headers in an array form, e.g. when proxying.
1 parent f4586c9 commit 7c3bcf5

File tree

3 files changed

+56
-3
lines changed

3 files changed

+56
-3
lines changed

lib/_http_outgoing.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,14 @@ function _storeHeader(firstLine, headers) {
381381
processHeader(this, state, entry[0], entry[1], false);
382382
}
383383
} else if (ArrayIsArray(headers)) {
384-
for (const entry of headers) {
385-
processHeader(this, state, entry[0], entry[1], true);
384+
if (headers.length && ArrayIsArray(headers[0])) {
385+
for (const entry of headers) {
386+
processHeader(this, state, entry[0], entry[1], true);
387+
}
388+
} else {
389+
for (let n = 0; n < headers.length; n += 2) {
390+
processHeader(this, state, headers[n + 0], headers[n + 1], true);
391+
}
386392
}
387393
} else {
388394
for (const key in headers) {

lib/_http_server.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
'use strict';
2323

2424
const {
25+
ArrayIsArray,
2526
Error,
2627
ObjectKeys,
2728
ObjectSetPrototypeOf,
@@ -278,7 +279,12 @@ function writeHead(statusCode, reason, obj) {
278279
if (this[kOutHeaders]) {
279280
// Slow-case: when progressive API and header fields are passed.
280281
let k;
281-
if (obj) {
282+
if (ArrayIsArray(obj)) {
283+
for (let n = 0; n < obj.length; n += 2) {
284+
k = obj[n + 0];
285+
if (k) this.setHeader(k, obj[n + 1]);
286+
}
287+
} else if (obj) {
282288
const keys = ObjectKeys(obj);
283289
// Retain for(;;) loop for performance reasons
284290
// Refs: https://github.com/nodejs/node/pull/30958
+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
6+
// Verify that ServerResponse.writeHead() works with arrays.
7+
8+
{
9+
const server = http.createServer(common.mustCall((req, res) => {
10+
res.setHeader('test', '1');
11+
res.writeHead(200, [ 'test', '2', 'test2', '2' ]);
12+
res.end();
13+
}));
14+
15+
server.listen(0, common.mustCall(() => {
16+
http.get({ port: server.address().port }, common.mustCall((res) => {
17+
assert.strictEqual(res.headers.test, '2');
18+
assert.strictEqual(res.headers.test2, '2');
19+
res.resume().on('end', () => {
20+
server.close();
21+
});
22+
}));
23+
}));
24+
}
25+
26+
{
27+
const server = http.createServer(common.mustCall((req, res) => {
28+
res.writeHead(200, [ 'test', '1', 'test2', '2' ]);
29+
res.end();
30+
}));
31+
32+
server.listen(0, common.mustCall(function() {
33+
http.get({ port: server.address().port }, common.mustCall((res) => {
34+
assert.strictEqual(res.headers.test, '1');
35+
assert.strictEqual(res.headers.test2, '2');
36+
res.resume().on('end', () => {
37+
server.close();
38+
});
39+
}));
40+
}));
41+
}

0 commit comments

Comments
 (0)