diff --git a/lib/net.js b/lib/net.js index 09ad917ad0b7f6..90e0db558e3a9b 100644 --- a/lib/net.js +++ b/lib/net.js @@ -245,7 +245,7 @@ function Socket(options) { // shut down the socket when we're finished with it. this.on('finish', onSocketFinish); - this.on('_socketEnd', onSocketEnd); + this.on('end', onReadableStreamEnd); initSocketHandle(this); @@ -341,32 +341,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. @@ -512,6 +486,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 && @@ -625,10 +605,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 9499cd95275f8c..9b7432f03a7542 100644 --- a/test/parallel/test-http-connect.js +++ b/test/parallel/test-http-connect.js @@ -71,7 +71,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);