From 281d00eebdc53e4a018cf4876f04eaf75538afd2 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Tue, 6 Feb 2018 23:00:15 +0100 Subject: [PATCH] net: inline and simplify onSocketEnd PR-URL: https://github.com/nodejs/node/pull/18607 Reviewed-By: Luigi Pinca Reviewed-By: Matteo Collina Reviewed-By: James M Snell --- lib/net.js | 41 ++++++++---------------------- test/parallel/test-http-connect.js | 3 ++- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/lib/net.js b/lib/net.js index edf8a6c0bc545b..7095a5190a17ea 100644 --- a/lib/net.js +++ b/lib/net.js @@ -256,7 +256,7 @@ function Socket(options) { } // shut down the socket when we're finished with it. - this.on('_socketEnd', onSocketEnd); + this.on('end', onReadableStreamEnd); initSocketHandle(this); @@ -360,32 +360,6 @@ function afterShutdown(status, handle) { } } -// the EOF has been received, and no more bytes are coming. -// if the writable side has ended already, then clean everything -// up. -function onSocketEnd() { - // XXX Should not have to do as much in this function. - // ended should already be true, since this is called *after* - // the EOF errno and onread has eof'ed - debug('onSocketEnd', this._readableState); - this._readableState.ended = true; - if (this._readableState.endEmitted) { - this.readable = false; - maybeDestroy(this); - } else { - this.once('end', function end() { - this.readable = false; - maybeDestroy(this); - }); - this.read(0); - } - - if (!this.allowHalfOpen) { - this.write = writeAfterFIN; - this.destroySoon(); - } -} - // Provide a better error message when we call end() as a result // of the other side sending a FIN. The standard 'write after end' // is overly vague, and makes it seem like the user's code is to blame. @@ -537,6 +511,12 @@ Socket.prototype.end = function(data, encoding, callback) { }; +// Called when the 'end' event is emitted. +function onReadableStreamEnd() { + maybeDestroy(this); +} + + // Call whenever we set writable=false or readable=false function maybeDestroy(socket) { if (!socket.readable && @@ -651,10 +631,11 @@ function onread(nread, buffer) { // Do it before `maybeDestroy` for correct order of events: // `end` -> `close` self.push(null); + self.read(0); - if (self.readableLength === 0) { - self.readable = false; - maybeDestroy(self); + if (!self.allowHalfOpen) { + self.write = writeAfterFIN; + self.destroySoon(); } // internal end event so that we know that the actual socket diff --git a/test/parallel/test-http-connect.js b/test/parallel/test-http-connect.js index b019c61573e3fa..06f855db9a0702 100644 --- a/test/parallel/test-http-connect.js +++ b/test/parallel/test-http-connect.js @@ -65,7 +65,8 @@ server.listen(0, common.mustCall(() => { // the stream.Duplex onend listener // allow 0 here, so that i can run the same test on streams1 impl - assert(socket.listeners('end').length <= 1); + assert(socket.listenerCount('end') <= 2, + `Found ${socket.listenerCount('end')} end listeners`); assert.strictEqual(socket.listeners('free').length, 0); assert.strictEqual(socket.listeners('close').length, 0);