mirror of
https://github.com/nodejs/node.git
synced 2025-05-09 19:38:23 +00:00

When sockets of the "net" module destroyed, they will call `this._handle.close()` which will also emit EOF if not emitted before. This feature makes sockets on the other side emit "end" and "close" even though we haven't called `end()`. As `stream` of `StreamWrap` are likely to be instances of `net.Socket`, calling `destroy()` manually will avoid issues that don't properly close wrapped connections. Fixes: https://github.com/nodejs/node/issues/14605 PR-URL: https://github.com/nodejs/node/pull/23654 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
119 lines
3.3 KiB
JavaScript
119 lines
3.3 KiB
JavaScript
'use strict';
|
|
|
|
const common = require('../common');
|
|
const StreamWrap = require('_stream_wrap');
|
|
const net = require('net');
|
|
|
|
// This test ensures that when we directly call `socket.destroy()` without
|
|
// having called `socket.end()` on an instance of streamWrap, it will
|
|
// still emit EOF which makes the socket on the other side emit "end" and
|
|
// "close" events, and vice versa.
|
|
{
|
|
let port;
|
|
const server = net.createServer((socket) => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustNotCall());
|
|
socket.on('close', common.mustCall());
|
|
socket.destroy();
|
|
});
|
|
|
|
server.listen(() => {
|
|
port = server.address().port;
|
|
createSocket();
|
|
});
|
|
|
|
function createSocket() {
|
|
let streamWrap;
|
|
const socket = new net.connect({
|
|
port,
|
|
}, () => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustCall());
|
|
socket.on('close', common.mustCall());
|
|
|
|
streamWrap.on('error', common.mustNotCall());
|
|
// The "end" events will be emitted which is as same as
|
|
// the same situation for an instance of `net.Socket` without
|
|
// `StreamWrap`.
|
|
streamWrap.on('end', common.mustCall());
|
|
// Destroying a socket in the server side should emit EOF and cause
|
|
// the corresponding client-side socket closed.
|
|
streamWrap.on('close', common.mustCall(() => {
|
|
server.close();
|
|
}));
|
|
});
|
|
streamWrap = new StreamWrap(socket);
|
|
}
|
|
}
|
|
|
|
// Destroy the streamWrap and test again.
|
|
{
|
|
let port;
|
|
const server = net.createServer((socket) => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustCall());
|
|
socket.on('close', common.mustCall(() => {
|
|
server.close();
|
|
}));
|
|
// Do not `socket.end()` and directly `socket.destroy()`.
|
|
});
|
|
|
|
server.listen(() => {
|
|
port = server.address().port;
|
|
createSocket();
|
|
});
|
|
|
|
function createSocket() {
|
|
let streamWrap;
|
|
const socket = new net.connect({
|
|
port,
|
|
}, () => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustNotCall());
|
|
socket.on('close', common.mustCall());
|
|
|
|
streamWrap.on('error', common.mustNotCall());
|
|
streamWrap.on('end', common.mustNotCall());
|
|
// Destroying a socket in the server side should emit EOF and cause
|
|
// the corresponding client-side socket closed.
|
|
streamWrap.on('close', common.mustCall());
|
|
streamWrap.destroy();
|
|
});
|
|
streamWrap = new StreamWrap(socket);
|
|
}
|
|
}
|
|
|
|
// Destroy the client socket and test again.
|
|
{
|
|
let port;
|
|
const server = net.createServer((socket) => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustCall());
|
|
socket.on('close', common.mustCall(() => {
|
|
server.close();
|
|
}));
|
|
});
|
|
|
|
server.listen(() => {
|
|
port = server.address().port;
|
|
createSocket();
|
|
});
|
|
|
|
function createSocket() {
|
|
let streamWrap;
|
|
const socket = new net.connect({
|
|
port,
|
|
}, () => {
|
|
socket.on('error', common.mustNotCall());
|
|
socket.on('end', common.mustNotCall());
|
|
socket.on('close', common.mustCall());
|
|
|
|
streamWrap.on('error', common.mustNotCall());
|
|
streamWrap.on('end', common.mustNotCall());
|
|
streamWrap.on('close', common.mustCall());
|
|
socket.destroy();
|
|
});
|
|
streamWrap = new StreamWrap(socket);
|
|
}
|
|
}
|