Skip to content

Commit 46e0893

Browse files
fix: throw ERR_HTTP_HEADERS_SENT error after multiple writeHead
1 parent 1728ed5 commit 46e0893

File tree

3 files changed

+28
-61
lines changed

3 files changed

+28
-61
lines changed

lib/_http_server.js

+5
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,11 @@ ServerResponse.prototype._implicitHeader = function _implicitHeader() {
331331

332332
ServerResponse.prototype.writeHead = writeHead;
333333
function writeHead(statusCode, reason, obj) {
334+
335+
if (this._header) {
336+
throw new ERR_HTTP_HEADERS_SENT('writeHead');
337+
}
338+
334339
const originalStatusCode = statusCode;
335340

336341
statusCode |= 0;

test/parallel/test-http-write-head-2.js

-60
Original file line numberDiff line numberDiff line change
@@ -59,63 +59,3 @@ const http = require('http');
5959
}));
6060
}));
6161
}
62-
63-
{
64-
const server = http.createServer((req, res) => {
65-
try {
66-
res.writeHead(200,[ 'test', '1' ]);
67-
res.writeHead(200,[ 'test2', '2' ]);
68-
res.end();
69-
} catch (error) {
70-
assert.strictEqual(err.code, 'ERR_INVALID_ARG_VALUE');
71-
}
72-
});
73-
74-
server.listen(0, () => {
75-
http.get({ port: server.address().port }, common.mustCall((res) => {
76-
assert.equal('test' in res.headers, false)
77-
assert.strictEqual(res.headers.test2, '2');
78-
res.resume().on('end', common.mustCall(() => {
79-
server.close();
80-
}));
81-
}));
82-
});
83-
}
84-
85-
{
86-
const server = http.createServer((req, res) => {
87-
res.writeHead(200,[ 'test', '1' ]);
88-
assert.equal(res.getHeader('test'), undefined)
89-
res.end();
90-
});
91-
92-
server.listen(0, () => {
93-
http.get({ port: server.address().port }, (res) => {
94-
assert.strictEqual(res.headers.test, '1');
95-
res.resume().on('end', common.mustCall(() => {
96-
server.close();
97-
}));
98-
});
99-
});
100-
}
101-
102-
{
103-
const server = http.createServer((req, res) => {
104-
res.setHeader('test2','2')
105-
res.writeHead(200,[ 'test', '1' ]);
106-
assert.strictEqual(res.getHeader('test'), '1');
107-
assert.strictEqual(res.getHeader('test2'), '2');
108-
res.end();
109-
});
110-
111-
server.listen(0, () => {
112-
http.get({ port: server.address().port }, (res) => {
113-
assert.strictEqual(res.headers.test, '1');
114-
assert.strictEqual(res.headers.test2, '2');
115-
res.resume().on('end', common.mustCall(() => {
116-
server.close();
117-
}));
118-
});
119-
});
120-
}
121-

test/parallel/test-http-write-head.js

+23-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ const s = http.createServer(common.mustCall((req, res) => {
5858
}, {
5959
code: 'ERR_HTTP_HEADERS_SENT',
6060
name: 'Error',
61-
message: 'Cannot render headers after they are sent to the client'
61+
message: 'Cannot writeHead headers after they are sent to the client'
6262
});
6363

6464
res.end();
@@ -76,3 +76,25 @@ function runTest() {
7676
response.resume();
7777
}));
7878
}
79+
80+
{
81+
const server = http.createServer((req, res) => {
82+
res.writeHead(200, [ 'test', '1' ]);
83+
assert.throws(() => res.writeHead(200, [ 'test2', '2' ]), {
84+
code: 'ERR_HTTP_HEADERS_SENT',
85+
name: 'Error',
86+
message: 'Cannot writeHead headers after they are sent to the client'
87+
});
88+
res.end();
89+
});
90+
91+
server.listen(0, () => {
92+
http.get({ port: server.address().port }, (res) => {
93+
assert.strictEqual(res.headers.test, '1');
94+
assert.strictEqual('test2' in res.headers, false);
95+
res.resume().on('end', common.mustCall(() => {
96+
server.close();
97+
}));
98+
});
99+
});
100+
}

0 commit comments

Comments
 (0)