mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Better fix for TCP node reset
now handles reply out node, and can specify which connection to reset.
This commit is contained in:
		| @@ -411,23 +411,33 @@ module.exports = function(RED) { | ||||
|                 if (msg._session && msg._session.type == "tcp") { | ||||
|                     var client = connectionPool[msg._session.id]; | ||||
|                     if (client) { | ||||
|                         if (Buffer.isBuffer(msg.payload)) { | ||||
|                             client.write(msg.payload); | ||||
|                         } else if (typeof msg.payload === "string" && node.base64) { | ||||
|                             client.write(Buffer.from(msg.payload,'base64')); | ||||
|                         } else { | ||||
|                             client.write(Buffer.from(""+msg.payload)); | ||||
|                         if (msg?.reset === true) { | ||||
|                             client.destroy(); | ||||
|                         } | ||||
|                         else { | ||||
|                             if (Buffer.isBuffer(msg.payload)) { | ||||
|                                 client.write(msg.payload); | ||||
|                             } else if (typeof msg.payload === "string" && node.base64) { | ||||
|                                 client.write(Buffer.from(msg.payload,'base64')); | ||||
|                             } else { | ||||
|                                 client.write(Buffer.from(""+msg.payload)); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 else { | ||||
|                     for (var i in connectionPool) { | ||||
|                         if (Buffer.isBuffer(msg.payload)) { | ||||
|                             connectionPool[i].write(msg.payload); | ||||
|                         } else if (typeof msg.payload === "string" && node.base64) { | ||||
|                             connectionPool[i].write(Buffer.from(msg.payload,'base64')); | ||||
|                         } else { | ||||
|                             connectionPool[i].write(Buffer.from(""+msg.payload)); | ||||
|                         if (msg?.reset === true) { | ||||
|                             connectionPool[i].destroy(); | ||||
|                         } | ||||
|                         else { | ||||
|                             if (Buffer.isBuffer(msg.payload)) { | ||||
|                                 connectionPool[i].write(msg.payload); | ||||
|                             } else if (typeof msg.payload === "string" && node.base64) { | ||||
|                                 connectionPool[i].write(Buffer.from(msg.payload,'base64')); | ||||
|                             } else { | ||||
|                                 connectionPool[i].write(Buffer.from(""+msg.payload)); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
| @@ -551,15 +561,29 @@ module.exports = function(RED) { | ||||
|                 msg.payload = msg.payload.toString(); | ||||
|             } | ||||
|  | ||||
|             if (node.out === "sit" && msg?.reset === true && node?.last_id && clients[node.last_id]) { | ||||
|                 node.status({}); | ||||
|                 clients[node.last_id].client.destroy(); | ||||
|                 delete clients[node.last_id]; | ||||
|             } | ||||
|  | ||||
|             var host = node.server || msg.host; | ||||
|             var port = node.port || msg.port; | ||||
|  | ||||
|             if (node.out === "sit" && msg?.reset) { | ||||
|                 if (msg.reset === true) { // kill all connections | ||||
|                     for (var cl in clients) { | ||||
|                         if (clients[cl].hasOwnProperty("client")) { | ||||
|                             clients[cl].client.destroy(); | ||||
|                             delete clients[cl]; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|                 if (typeof(msg.reset) === "string" && msg.reset.includes(":")) {  // just kill connection host:port | ||||
|                     if (clients.hasOwnProperty(msg.reset) && clients[msg.reset].hasOwnProperty("client")) { | ||||
|                         clients[msg.reset].client.destroy(); | ||||
|                         delete clients[msg.reset]; | ||||
|                     } | ||||
|                 } | ||||
|                 const cc = Object.keys(clients).length; | ||||
|                 node.status({fill:"green",shape:cc===0?"ring":"dot",text:RED._("tcpin.status.connections",{count:cc})}); | ||||
|                 if ((host === undefined || port === undefined) && !msg.hasOwnProperty("payload")) { return; } | ||||
|             } | ||||
|  | ||||
|             // Store client information independently | ||||
|             // the clients object will have: | ||||
|             // clients[id].client, clients[id].msg, clients[id].timeout | ||||
| @@ -627,7 +651,8 @@ module.exports = function(RED) { | ||||
|                     clients[connection_id].connecting = true; | ||||
|                     clients[connection_id].client.connect(connOpts, function() { | ||||
|                         //node.log(RED._("tcpin.errors.client-connected")); | ||||
|                         node.status({fill:"green",shape:"dot",text:"common.status.connected"}); | ||||
|                         // node.status({fill:"green",shape:"dot",text:"common.status.connected"}); | ||||
|                         node.status({fill:"green",shape:"dot",text:RED._("tcpin.status.connections",{count:Object.keys(clients).length})}); | ||||
|                         if (clients[connection_id] && clients[connection_id].client) { | ||||
|                             clients[connection_id].connected = true; | ||||
|                             clients[connection_id].connecting = false; | ||||
|   | ||||
| @@ -30,6 +30,8 @@ | ||||
|     before being sent.</p> | ||||
|     <p>If <code>msg._session</code> is not present the payload is | ||||
|     sent to <b>all</b> connected clients.</p> | ||||
|     <p>In Reply-to mode, setting <code>msg.reset = true</code> will reset the connection | ||||
|         specified by _session.id, or all connections if no _session.id is specified.</p> | ||||
|     <p><b>Note: </b>On some systems you may need root or administrator access | ||||
|     to access ports below 1024.</p> | ||||
| </script> | ||||
| @@ -40,7 +42,7 @@ | ||||
|     returned characters into a fixed buffer, match a specified character before returning, | ||||
|     wait a fixed timeout from first reply and then return, sit and wait for data, or send then close the connection | ||||
|     immediately, without waiting for a reply.</p> | ||||
|     <p>If in sit and wait mode (remain connected) you can send <code>msg.reset = true;</code> to force a break in | ||||
|     <p>If in sit and wait mode (remain connected) you can send <code>msg.reset = true</code> or <code>msg.reset = "host:port"</code> to force a break in | ||||
|     the connection and an automatic reconnection.</p> | ||||
|     <p>The response will be output in <code>msg.payload</code> as a buffer, so you may want to .toString() it.</p> | ||||
|     <p>If you leave tcp host or port blank they must be set by using the <code>msg.host</code> and <code>msg.port</code> properties in every message sent to the node.</p> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user