http: revert #14024 writable is never set to false · nodejs/node@771c2ac · GitHub
Skip to content

Commit 771c2ac

Browse files
mcollinajasnell
authored andcommitted
http: revert #14024 writable is never set to false
Setting writable = false in IncomingMessage.end made some errors being swallowed in some very popular OSS libraries that we must support. This commit add some of those use cases to the tests, so we avoid further regressions. We should reevaluate how to set writable = false in IncomingMessage in a way that does not break the ecosystem. See: #14024 Fixes: #15029 PR-URL: #15404 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
1 parent 389c8c3 commit 771c2ac

4 files changed

Lines changed: 50 additions & 8 deletions

lib/_http_outgoing.js

Lines changed: 0 additions & 1 deletion

test/parallel/test-http-outgoing-finish-writable.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@ const assert = require('assert');
44
const http = require('http');
55

66
// Verify that after calling end() on an `OutgoingMessage` (or a type that
7-
// inherits from `OutgoingMessage`), its `writable` property is set to false.
7+
// inherits from `OutgoingMessage`), its `writable` property is not set to false
88

99
const server = http.createServer(common.mustCall(function(req, res) {
1010
assert.strictEqual(res.writable, true);
1111
assert.strictEqual(res.finished, false);
1212
res.end();
13-
assert.strictEqual(res.writable, false);
13+
14+
// res.writable is set to false after it has finished sending
15+
// Ref: https://github.com/nodejs/node/issues/15029
16+
assert.strictEqual(res.writable, true);
1417
assert.strictEqual(res.finished, true);
1518

1619
server.close();
@@ -27,5 +30,9 @@ server.on('listening', common.mustCall(function() {
2730

2831
assert.strictEqual(clientRequest.writable, true);
2932
clientRequest.end();
30-
assert.strictEqual(clientRequest.writable, false);
33+
34+
// writable is still true when close
35+
// THIS IS LEGACY, we cannot change it
36+
// unless we break error detection
37+
assert.strictEqual(clientRequest.writable, true);
3138
}));
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const { get, createServer } = require('http');
6+
7+
// res.writable should not be set to false after it has finished sending
8+
// Ref: https://github.com/nodejs/node/issues/15029
9+
10+
let external;
11+
12+
// Http server
13+
const internal = createServer((req, res) => {
14+
res.writeHead(200);
15+
setImmediate(common.mustCall(() => {
16+
external.abort();
17+
res.end('Hello World\n');
18+
}));
19+
}).listen(0);
20+
21+
// Proxy server
22+
const server = createServer(common.mustCall((req, res) => {
23+
get(`http://127.0.0.1:${internal.address().port}`, common.mustCall((inner) => {
24+
res.on('close', common.mustCall(() => {
25+
assert.strictEqual(res.writable, true);
26+
}));
27+
inner.pipe(res);
28+
}));
29+
})).listen(0, () => {
30+
external = get(`http://127.0.0.1:${server.address().port}`);
31+
external.on('error', common.mustCall((err) => {
32+
server.close();
33+
internal.close();
34+
}));
35+
});

test/parallel/test-pipe-outgoing-message-data-emitted-after-ended.js

Lines changed: 5 additions & 4 deletions

0 commit comments

Comments
 (0)