From f1f00da1a83e2773a4f1a6e49d5a74b5f121f9a8 Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Wed, 23 Oct 2013 21:27:54 +0100 Subject: [PATCH 1/3] Allow http request node to pass through existing msg properties rather than wiping clean (in case needed on other side...) Also one more try / catch to xml parser... could still barf if provoked. --- nodes/analysis/73-parsexml.js | 25 +++--- nodes/io/21-httpin.js | 154 +++++++++++++++++----------------- 2 files changed, 89 insertions(+), 90 deletions(-) diff --git a/nodes/analysis/73-parsexml.js b/nodes/analysis/73-parsexml.js index 2d0e5225c..f7a73d411 100644 --- a/nodes/analysis/73-parsexml.js +++ b/nodes/analysis/73-parsexml.js @@ -30,17 +30,20 @@ function Xml2jsNode(n) { this.useEyes = n.useEyes; var node = this; this.on("input", function(msg) { - parseString(msg.payload, function (err, result) { - if (err) { node.error(err); } - else { - msg.payload = result; - node.send(msg); - if (node.useEyes == true) { - if (gotEyes == true) { eyes.inspect(msg); } - else { node.log(JSON.stringify(msg)); } - } - } - }); + try { + parseString(msg.payload, function (err, result) { + if (err) { node.error(err); } + else { + msg.payload = result; + node.send(msg); + if (node.useEyes == true) { + if (gotEyes == true) { eyes.inspect(msg); } + else { node.log(JSON.stringify(msg)); } + } + } + }); + } + catch(e) { console.log(e); } }); } RED.nodes.registerType("xml2js",Xml2jsNode); diff --git a/nodes/io/21-httpin.js b/nodes/io/21-httpin.js index 4e099d20b..b012cd92b 100644 --- a/nodes/io/21-httpin.js +++ b/nodes/io/21-httpin.js @@ -22,103 +22,99 @@ var urllib = require("url"); var bodyParser = require("express").bodyParser(); function HTTPIn(n) { - RED.nodes.createNode(this,n); - this.url = n.url; - this.method = n.method; + RED.nodes.createNode(this,n); + this.url = n.url; + this.method = n.method; - var node = this; - this.callback = function(req,res) { - node.send({req:req,res:res}); - } - if (this.method == "get") { - RED.app.get(this.url,this.callback); - } else if (this.method == "post") { - RED.app.post(this.url,bodyParser,this.callback); - } else if (this.method == "put") { - RED.app.put(this.url,bodyParser,this.callback); - } else if (this.method == "delete") { - RED.app.delete(this.url,this.callback); - } - - this.on("close",function() { - var routes = RED.app.routes[this.method]; - for (var i in routes) { - if (routes[i].path == this.url) { - routes.splice(i,1); - //break; - } - } - }); + var node = this; + this.callback = function(req,res) { + node.send({req:req,res:res}); + } + if (this.method == "get") { + RED.app.get(this.url,this.callback); + } else if (this.method == "post") { + RED.app.post(this.url,bodyParser,this.callback); + } else if (this.method == "put") { + RED.app.put(this.url,bodyParser,this.callback); + } else if (this.method == "delete") { + RED.app.delete(this.url,this.callback); + } + + this.on("close",function() { + var routes = RED.app.routes[this.method]; + for (var i in routes) { + if (routes[i].path == this.url) { + routes.splice(i,1); + //break; + } + } + }); } RED.nodes.registerType("http in",HTTPIn); function HTTPOut(n) { - RED.nodes.createNode(this,n); - var node = this; - this.on("input",function(msg) { - if (msg.res) { - if (msg.headers) { - res.set(msg.headers); - } - var statusCode = msg.statusCode || 200; - msg.res.send(statusCode,msg.payload); - } else { - node.warn("No response object"); - } - }); + RED.nodes.createNode(this,n); + var node = this; + this.on("input",function(msg) { + if (msg.res) { + if (msg.headers) { + res.set(msg.headers); + } + var statusCode = msg.statusCode || 200; + msg.res.send(statusCode,msg.payload); + } else { + node.warn("No response object"); + } + }); } RED.nodes.registerType("http response",HTTPOut); function HTTPRequest(n) { - RED.nodes.createNode(this,n); - var url = n.url; - var method = n.method || "GET"; - var httplib = (/^https/.test(url))?https:http; - var node = this; - this.on("input",function(msg) { - if (msg.url) { - httplib = (/^https/.test(msg.url))?https:http; - } - var opts = urllib.parse(msg.url||url); - opts.method = (msg.method||method).toUpperCase(); - if (msg.headers) { - opts.headers = msg.headers; - } - var req = httplib.request(opts,function(res) { - res.setEncoding('utf8'); - var message = { - statusCode: res.statusCode, - headers: res.headers, - payload: "" - }; - res.on('data',function(chunk) { - message.payload += chunk; - }); - res.on('end',function() { - node.send(message); - }); - }); - req.on('error',function(err) { - msg.payload = err.toString(); - msg.statusCode = err.code; - node.send(msg); - }); - if (msg.payload && (method == "POST" || method == "PUT") ) { - if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { + RED.nodes.createNode(this,n); + var url = n.url; + var method = n.method || "GET"; + var httplib = (/^https/.test(url))?https:http; + var node = this; + this.on("input",function(msg) { + + var opts = urllib.parse(msg.url||url); + opts.method = (msg.method||method).toUpperCase(); + if (msg.headers) { + opts.headers = msg.headers; + } + var req = httplib.request(opts,function(res) { + res.setEncoding('utf8'); + msg.statusCode = res.statusCode; + msg.headers = res.headers; + msg.payload = ""; + res.on('data',function(chunk) { + msg.payload += chunk; + }); + res.on('end',function() { + node.send(msg); + }); + }); + req.on('error',function(err) { + msg.payload = err.toString(); + msg.statusCode = err.code; + node.send(msg); + }); + if (msg.payload && (method == "PUSH" || method == "PUT") ) { + if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { req.write(msg.payload); } else if (typeof msg.payload == "number") { req.write(msg.payload+""); } else { req.write(JSON.stringify(msg.payload)); } - } - req.end(); - - - }); + } + req.end(); + + + }); } RED.nodes.registerType("http request",HTTPRequest); From a4160a6bea6209b3b3a9c5ce9233ea8e2981f523 Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Thu, 24 Oct 2013 19:58:57 +0100 Subject: [PATCH 2/3] Partial fix for Issue #45 - allows msg.destip and msg.port properties to override static config. Signed-off-by: Dave C-J --- nodes/io/32-udp.html | 4 +- nodes/io/32-udp.js | 158 ++++++++++++++++++++++--------------------- 2 files changed, 84 insertions(+), 78 deletions(-) diff --git a/nodes/io/32-udp.html b/nodes/io/32-udp.html index 25dbdc2ac..331962ec8 100644 --- a/nodes/io/32-udp.html +++ b/nodes/io/32-udp.html @@ -63,6 +63,7 @@ @@ -123,6 +123,7 @@ +
Tip: leave address and port blank if you want to set using msg.ip and msg.port.
@@ -157,10 +158,9 @@ color:"Silver", defaults: { name: {value:""}, - addr: {value:"",required:true}, - //group: {value:""}, + addr: {value:""}, iface: {value:""}, - port: {value:"",required:true,validate:RED.validators.number()}, + port: {value:""}, base64: {value:false,required:true}, multicast: {value:"false"} }, diff --git a/nodes/io/32-udp.js b/nodes/io/32-udp.js index 8666d655c..7470904cb 100644 --- a/nodes/io/32-udp.js +++ b/nodes/io/32-udp.js @@ -41,7 +41,7 @@ function UDPin(n) { var msg; if (node.datatype =="base64") { msg = { payload:message.toString('base64'), fromip:remote.address+':'+remote.port }; } else if (node.datatype =="utf8") { msg = { payload:message.toString('utf8'), fromip:remote.address+':'+remote.port }; } - else { msg = { payload:message, fromip:remote.address+':'+remote.port }; } + else { msg = { payload:message, fromip:remote.address+':'+remote.port, ip:remote.address, port:remote.port }; } node.send(msg); }); @@ -95,16 +95,21 @@ function UDPout(n) { node.on("input", function(msg) { if (msg.payload != null) { - //console.log("UDP:",msg.payload); - var add = msg.destip || node.addr; - var por = msg.port || node.addr; - var message; - if (node.base64) { message = new Buffer(b64string, 'base64'); } - else { message = new Buffer(""+msg.payload); } - //console.log("UDP send :",add,por); - sock.send(message, 0, message.length, por, add, function(err, bytes) { - if (err) node.error("udp : "+err); - }); + var add = node.addr || msg.ip || ""; + var por = node.port || msg.port || 0; + if (add == "") { node.warn("udp: ip address not set"); } + else if (por == 0) { node.warn("udp: port not set"); } + else if (isNaN(por) || (por < 1) || (por > 65535)) { node.warn("udp: port number not valid"); } + else { + var message; + if (node.base64) { message = new Buffer(b64string, 'base64'); } + else if (msg.payload instanceof Buffer) { message = msg.payload; } + else { message = new Buffer(""+msg.payload); } + console.log("UDP send :",add,por,msg.payload.toString()); + sock.send(message, 0, message.length, por, add, function(err, bytes) { + if (err) node.error("udp : "+err); + }); + } } });