diff --git a/nodes/io/21-httpin.html b/nodes/io/21-httpin.html index 3e438f6ec..6bf97615c 100644 --- a/nodes/io/21-httpin.html +++ b/nodes/io/21-httpin.html @@ -76,7 +76,7 @@ outputs:1, icon: "white-globe.png", label: function() { - return this.name||"["+this.method+"] "+this.url; + return this.name||(this.url?("["+this.method+"] "+this.url):"http"); }, labelStyle: function() { return this.name?"node_label_italic":""; @@ -85,14 +85,19 @@ + + + + + + + + + + + + + + diff --git a/nodes/io/21-httpin.js b/nodes/io/21-httpin.js index 95a57b5cd..c3e3a027b 100644 --- a/nodes/io/21-httpin.js +++ b/nodes/io/21-httpin.js @@ -16,6 +16,10 @@ var RED = require("../../red/red"); var util = require("util"); +var http = require("http"); +var https = require("https"); +var urllib = require("url"); +var bodyParser = require("express").bodyParser(); function HTTPIn(n) { RED.nodes.createNode(this,n); @@ -24,14 +28,15 @@ function HTTPIn(n) { var node = this; this.callback = function(req,res) { + console.log(arguments.length); 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,this.callback); + RED.app.post(this.url,bodyParser,this.callback); } else if (this.method == "put") { - RED.app.put(this.url,this.callback); + RED.app.put(this.url,bodyParser,this.callback); } else if (this.method == "delete") { RED.app.delete(this.url,this.callback); } @@ -41,7 +46,7 @@ function HTTPIn(n) { for (var i in routes) { if (routes[i].path == this.url) { routes.splice(i,1); - break; + //break; } } }); @@ -58,10 +63,59 @@ function HTTPOut(n) { if (msg.headers) { res.set(msg.headers); } - var rc = msg.rc || 200; - msg.res.send(rc,msg.payload); + var statusCode = msg.statusCode || 200; + msg.res.send(statusCode,msg.payload); } }); } 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) { + + var opts = urllib.parse(msg.url||url); + opts.method = msg.method||method; + if (msg.headers) { + opts.header = 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) { + 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(); + + + }); +} + +RED.nodes.registerType("http request",HTTPRequest); diff --git a/nodes/io/90-httpget.html b/nodes/io/90-httpget.html index 65be8202f..643c35c31 100644 --- a/nodes/io/90-httpget.html +++ b/nodes/io/90-httpget.html @@ -15,6 +15,8 @@ -->