feat: disconnect passive server after timeout
If no client connects within 30 seconds of requesting, close the server. This prevents multiple servers from being created and never closing.
This commit is contained in:
@@ -6,6 +6,8 @@ const Promise = require('bluebird');
|
||||
const Connector = require('./base');
|
||||
const errors = require('../errors');
|
||||
|
||||
const CONNECT_TIMEOUT = 30 * 1000;
|
||||
|
||||
class Passive extends Connector {
|
||||
constructor(connection) {
|
||||
super(connection);
|
||||
@@ -30,6 +32,9 @@ class Passive extends Connector {
|
||||
this.closeServer();
|
||||
return this.server.getNextPasvPort()
|
||||
.then((port) => {
|
||||
this.dataSocket = null;
|
||||
let idleServerTimeout;
|
||||
|
||||
const connectionHandler = (socket) => {
|
||||
if (!ip.isEqual(this.connection.commandSocket.remoteAddress, socket.remoteAddress)) {
|
||||
this.log.error({
|
||||
@@ -41,6 +46,8 @@ class Passive extends Connector {
|
||||
return this.connection.reply(550, 'Remote addresses do not match')
|
||||
.finally(() => this.connection.close());
|
||||
}
|
||||
clearTimeout(idleServerTimeout);
|
||||
|
||||
this.log.trace({port, remoteAddress: socket.remoteAddress}, 'Passive connection fulfilled.');
|
||||
|
||||
this.dataSocket = socket;
|
||||
@@ -52,8 +59,6 @@ class Passive extends Connector {
|
||||
}
|
||||
};
|
||||
|
||||
this.dataSocket = null;
|
||||
|
||||
const serverOptions = Object.assign({}, this.connection.secure ? this.server.options.tls : {}, {pauseOnConnect: true});
|
||||
this.dataServer = (this.connection.secure ? tls : net).createServer(serverOptions, connectionHandler);
|
||||
this.dataServer.maxConnections = 1;
|
||||
@@ -74,6 +79,8 @@ class Passive extends Connector {
|
||||
this.dataServer.listen(port, this.server.url.hostname, (err) => {
|
||||
if (err) reject(err);
|
||||
else {
|
||||
idleServerTimeout = setTimeout(() => this.closeServer(), CONNECT_TIMEOUT);
|
||||
|
||||
this.log.debug({port}, 'Passive connection listening');
|
||||
resolve(this.dataServer);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user