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 <ronagy@icloud.com>
Reviewed-By: Paolo Insogna <paolo@cowtech.it>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
This commit is contained in:
Marco Ippolito 2022-11-24 09:29:07 +01:00 committed by GitHub
parent be9cd3ecb0
commit c03354d3e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 3 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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();
}));
});
}));
}