From 9c1a62f4d883b4adbf895761afb7decff394a507 Mon Sep 17 00:00:00 2001 From: theanarkh Date: Sat, 25 Jun 2022 02:47:43 +0800 Subject: [PATCH] net: fix net keepalive and noDelay 1. support setKeepAlive again 2. set keepalive and nodelay to socket which is created by server --- lib/net.js | 14 +++++++++++++- test/parallel/test-net-server-keepalive.js | 13 +++++++++++++ test/parallel/test-net-server-nodelay.js | 7 +++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/net.js b/lib/net.js index f72a745bcc7ef3..cb4f58aa02b0f9 100644 --- a/lib/net.js +++ b/lib/net.js @@ -554,7 +554,16 @@ Socket.prototype.setKeepAlive = function(enable, initialDelayMsecs) { return this; } - if (this._handle.setKeepAlive && enable !== this[kSetKeepAlive]) { + if (!this._handle.setKeepAlive) { + return this; + } + + if (enable !== this[kSetKeepAlive] || + ( + enable && + this[kSetKeepAliveInitialDelay] != initialDelay + ) + ) { this[kSetKeepAlive] = enable; this[kSetKeepAliveInitialDelay] = initialDelay; this._handle.setKeepAlive(enable, initialDelay); @@ -1660,9 +1669,12 @@ function onconnection(err, clientHandle) { }); if (self.noDelay && clientHandle.setNoDelay) { + socket[kSetNoDelay] = true; clientHandle.setNoDelay(true); } if (self.keepAlive && clientHandle.setKeepAlive) { + socket[kSetKeepAlive] = true; + socket[kSetKeepAliveInitialDelay] = self.keepAliveInitialDelay; clientHandle.setKeepAlive(true, self.keepAliveInitialDelay); } diff --git a/test/parallel/test-net-server-keepalive.js b/test/parallel/test-net-server-keepalive.js index 384787d22bb69c..05e185365a357b 100644 --- a/test/parallel/test-net-server-keepalive.js +++ b/test/parallel/test-net-server-keepalive.js @@ -7,6 +7,17 @@ const server = net.createServer({ keepAlive: true, keepAliveInitialDelay: 1000 }, common.mustCall((socket) => { + const symbols = Object.getOwnPropertySymbols(socket); + for (let i = 0; i < symbols.length; i++) { + if (symbols[i].toString() === 'Symbol(kSetKeepAlive)') { + assert.strictEqual(socket[symbols[i]], server.keepAlive) + } else if (symbols[i].toString() === 'Symbol(kSetKeepAliveInitialDelay)') { + assert.strictEqual(socket[symbols[i]], server.keepAliveInitialDelay); + socket.setKeepAlive(true, 2000); + socket.setKeepAlive(true, 3000); + assert.strictEqual(socket[symbols[i]], 3000 / 1000); + } + } socket.destroy(); server.close(); })).listen(0, common.mustCall(() => { @@ -20,6 +31,8 @@ server._handle.onconnection = common.mustCall((err, clientHandle) => { assert.strictEqual(enable, server.keepAlive); assert.strictEqual(initialDelayMsecs, server.keepAliveInitialDelay); setKeepAlive.call(clientHandle, enable, initialDelayMsecs); + clientHandle.setKeepAlive = setKeepAlive; }); onconnection.call(server._handle, err, clientHandle); }); + diff --git a/test/parallel/test-net-server-nodelay.js b/test/parallel/test-net-server-nodelay.js index f5ee77f71c5383..34c3f4a74a4206 100644 --- a/test/parallel/test-net-server-nodelay.js +++ b/test/parallel/test-net-server-nodelay.js @@ -6,6 +6,13 @@ const net = require('net'); const server = net.createServer({ noDelay: true }, common.mustCall((socket) => { + const symbols = Object.getOwnPropertySymbols(socket); + for (let i = 0; i < symbols.length; i++) { + if (symbols[i].toString() === 'Symbol(kSetNoDelay)') { + assert.strictEqual(socket[symbols[i]], server.noDelay); + break; + } + } socket.destroy(); server.close(); })).listen(0, common.mustCall(() => {