From f1f00da1a83e2773a4f1a6e49d5a74b5f121f9a8 Mon Sep 17 00:00:00 2001 From: Dave C-J Date: Wed, 23 Oct 2013 21:27:54 +0100 Subject: [PATCH] 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);