Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 11 additions & 30 deletions lib/net.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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 &&
Expand Down Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion test/parallel/test-http-connect.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down