Skip to content

Commit c6e3849

Browse files
committed
🔒️ fix array handling
1 parent 6893518 commit c6e3849

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

index.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,20 @@ function onHeaders (res, listener) {
7474
*/
7575

7676
function setHeadersFromArray (res, headers) {
77-
for (var i = 0; i < headers.length; i++) {
78-
res.setHeader(headers[i][0], headers[i][1])
77+
if (headers.length && Array.isArray(headers[0])) {
78+
// 2D
79+
for (var i = 0; i < headers.length; i++) {
80+
res.setHeader(headers[i][0], headers[i][1])
81+
}
82+
} else {
83+
if (headers.length % 2 !== 0) {
84+
throw new TypeError('headers array is malformed')
85+
}
86+
87+
// 1D
88+
for (var j = 0; j < headers.length; j += 2) {
89+
res.setHeader(headers[j], headers[j + 1])
90+
}
7991
}
8092
}
8193

test/test.js

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,64 @@ describe('onHeaders(res, listener)', function () {
278278
.expect(201, done)
279279
})
280280
})
281+
282+
describe('writeHead(status, flat arr)', function () {
283+
it('should be available in listener', function (done) {
284+
var server = createServer(listener, handler)
285+
286+
function handler (req, res) {
287+
res.writeHead(201, ['X-Outgoing', 'test'])
288+
}
289+
290+
function listener (req, res) {
291+
this.setHeader('X-Status', this.statusCode)
292+
this.setHeader('X-Outgoing-Echo', this.getHeader('X-Outgoing'))
293+
}
294+
295+
request(server)
296+
.get('/')
297+
.expect('X-Status', '201')
298+
.expect('X-Outgoing-Echo', 'test')
299+
.expect(201, done)
300+
})
301+
})
302+
303+
describe('writeHead(status, invalid flat arr)', function () {
304+
it('should throw on malformed array', function (done) {
305+
var server = createServer(listener, handler)
306+
307+
function handler (req, res) {
308+
assert.throws(function () {
309+
res.writeHead(201, ['foo', 'bar', 'baz'])
310+
},
311+
TypeError)
312+
}
313+
314+
function listener (req, res) {
315+
}
316+
317+
// gets a 200 here because we caught the error via assert.throws
318+
request(server)
319+
.get('/')
320+
.expect(200, done)
321+
})
322+
323+
it('should return 500 on malformed array', function (done) {
324+
var server = createServer(listener, handler)
325+
326+
function handler (req, res) {
327+
res.writeHead(201, ['foo', 'bar', 'baz'])
328+
res.end('no soup for you!')
329+
}
330+
331+
function listener (req, res) {
332+
}
333+
334+
request(server)
335+
.get('/')
336+
.expect(500, done)
337+
})
338+
})
281339
})
282340

283341
function createServer (listener, handler) {

0 commit comments

Comments
 (0)