net: inline and simplify onSocketEnd
PR-URL: https://github.com/nodejs/node/pull/18607 Reviewed-By: Luigi Pinca <luigipinca@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
parent
45982de418
commit
281d00eebd
41
lib/net.js
41
lib/net.js
@ -256,7 +256,7 @@ function Socket(options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// shut down the socket when we're finished with it.
|
// shut down the socket when we're finished with it.
|
||||||
this.on('_socketEnd', onSocketEnd);
|
this.on('end', onReadableStreamEnd);
|
||||||
|
|
||||||
initSocketHandle(this);
|
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
|
// Provide a better error message when we call end() as a result
|
||||||
// of the other side sending a FIN. The standard 'write after end'
|
// 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.
|
// 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
|
// Call whenever we set writable=false or readable=false
|
||||||
function maybeDestroy(socket) {
|
function maybeDestroy(socket) {
|
||||||
if (!socket.readable &&
|
if (!socket.readable &&
|
||||||
@ -651,10 +631,11 @@ function onread(nread, buffer) {
|
|||||||
// Do it before `maybeDestroy` for correct order of events:
|
// Do it before `maybeDestroy` for correct order of events:
|
||||||
// `end` -> `close`
|
// `end` -> `close`
|
||||||
self.push(null);
|
self.push(null);
|
||||||
|
self.read(0);
|
||||||
|
|
||||||
if (self.readableLength === 0) {
|
if (!self.allowHalfOpen) {
|
||||||
self.readable = false;
|
self.write = writeAfterFIN;
|
||||||
maybeDestroy(self);
|
self.destroySoon();
|
||||||
}
|
}
|
||||||
|
|
||||||
// internal end event so that we know that the actual socket
|
// internal end event so that we know that the actual socket
|
||||||
|
@ -65,7 +65,8 @@ server.listen(0, common.mustCall(() => {
|
|||||||
|
|
||||||
// the stream.Duplex onend listener
|
// the stream.Duplex onend listener
|
||||||
// allow 0 here, so that i can run the same test on streams1 impl
|
// 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('free').length, 0);
|
||||||
assert.strictEqual(socket.listeners('close').length, 0);
|
assert.strictEqual(socket.listeners('close').length, 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user