From c03354d3e00d12a749da23200d666049b470ba32 Mon Sep 17 00:00:00 2001 From: Marco Ippolito Date: Thu, 24 Nov 2022 09:29:07 +0100 Subject: [PATCH] test: test case for multiple res.writeHead and res.getHeader PR-URL: https://github.com/nodejs/node/pull/45508 Fixes: https://github.com/nodejs/node/issues/36721 Reviewed-By: Robert Nagy Reviewed-By: Paolo Insogna Reviewed-By: Luigi Pinca Reviewed-By: Yagiz Nizipli Reviewed-By: Matteo Collina --- lib/_http_server.js | 5 +++++ test/parallel/test-domain-multi.js | 5 +++-- test/parallel/test-http-write-head.js | 22 +++++++++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/_http_server.js b/lib/_http_server.js index f882ee7d2a6..1783a407370 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -331,6 +331,11 @@ ServerResponse.prototype._implicitHeader = function _implicitHeader() { ServerResponse.prototype.writeHead = writeHead; function writeHead(statusCode, reason, obj) { + + if (this._header) { + throw new ERR_HTTP_HEADERS_SENT('write'); + } + const originalStatusCode = statusCode; statusCode |= 0; diff --git a/test/parallel/test-domain-multi.js b/test/parallel/test-domain-multi.js index 4a30dfeec04..27cdff7b1c9 100644 --- a/test/parallel/test-domain-multi.js +++ b/test/parallel/test-domain-multi.js @@ -46,8 +46,9 @@ const server = http.createServer((req, res) => { b.on('error', common.mustCall((er) => { if (res) { - res.writeHead(500); - res.end('An error occurred'); + // Introduce an error on the client by writing unexpected data. + // The client is now expecting a chunk header so any letter will have the parser throw an error. + res.socket.write('H'); } // res.writeHead(500), res.destroy, etc. server.close(); diff --git a/test/parallel/test-http-write-head.js b/test/parallel/test-http-write-head.js index 2199f11be61..e132f607ba0 100644 --- a/test/parallel/test-http-write-head.js +++ b/test/parallel/test-http-write-head.js @@ -58,7 +58,6 @@ const s = http.createServer(common.mustCall((req, res) => { }, { code: 'ERR_HTTP_HEADERS_SENT', name: 'Error', - message: 'Cannot render headers after they are sent to the client' }); res.end(); @@ -76,3 +75,24 @@ function runTest() { response.resume(); })); } + +{ + const server = http.createServer(common.mustCall((req, res) => { + res.writeHead(200, [ 'test', '1' ]); + assert.throws(() => res.writeHead(200, [ 'test2', '2' ]), { + code: 'ERR_HTTP_HEADERS_SENT', + name: 'Error', + }); + res.end(); + })); + + server.listen(0, common.mustCall(() => { + http.get({ port: server.address().port }, (res) => { + assert.strictEqual(res.headers.test, '1'); + assert.strictEqual('test2' in res.headers, false); + res.resume().on('end', common.mustCall(() => { + server.close(); + })); + }); + })); +}