http: do not abort if socket is missing

Fixes: https://github.com/nodejs/node/issues/14368

PR-URL: https://github.com/nodejs/node/pull/14387
Reviewed-By: Refael Ackermann <refack@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
This commit is contained in:
Matteo Collina 2017-07-20 18:02:54 +02:00 committed by Jeremiah Senkpiel
parent 107db33fb9
commit 69fdb47e20
2 changed files with 28 additions and 1 deletions

View File

@ -642,7 +642,7 @@ OutgoingMessage.prototype.write = function write(chunk, encoding, callback) {
function write_(msg, chunk, encoding, callback, fromEnd) {
if (msg.finished) {
var err = new Error('write after end');
nextTick(msg.socket[async_id_symbol],
nextTick(msg.socket && msg.socket[async_id_symbol],
writeAfterEndNT.bind(msg),
err,
callback);

View File

@ -0,0 +1,27 @@
'use strict';
const common = require('../common');
const http = require('http');
const assert = require('assert');
// Fix for https://github.com/nodejs/node/issues/14368
const server = http.createServer(handle);
function handle(req, res) {
res.on('error', common.mustCall((err) => {
assert.strictEqual(err.message, 'write after end');
server.close();
}));
res.write('hello');
res.end();
setImmediate(common.mustCall(() => {
res.write('world');
}));
}
server.listen(0, common.mustCall(() => {
http.get(`http://localhost:${server.address().port}`);
}));