@@ -290,7 +291,7 @@
RED.tray.resize();
});
$("#node-input-method").on("change", function() {
- if ($(this).val() == "GET") {
+ if ($(this).val() == "GET" || $(this).val() == "use") {
$(".node-input-paytoqs-row").show();
} else {
$(".node-input-paytoqs-row").hide();
diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js
index 9eac4da91..911f4daba 100644
--- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js
+++ b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js
@@ -16,7 +16,7 @@
module.exports = function(RED) {
"use strict";
- const got = require("got");
+ const got = require("got").default;
const {CookieJar} = require("tough-cookie");
const { HttpProxyAgent, HttpsProxyAgent } = require('hpagent');
const FormData = require('form-data');
@@ -69,8 +69,6 @@ in your Node-RED user directory (${RED.settings.userDir}).
var nodeUrl = n.url;
var isTemplatedUrl = (nodeUrl||"").indexOf("{{") != -1;
var nodeMethod = n.method || "GET";
- var paytoqs = false;
- var paytobody = false;
var redirectList = [];
var sendErrorsToCatch = n.senderr;
node.headers = n.headers || [];
@@ -78,15 +76,12 @@ in your Node-RED user directory (${RED.settings.userDir}).
if (n.tls) {
var tlsNode = RED.nodes.getNode(n.tls);
}
- this.ret = n.ret || "txt";
- this.authType = n.authType || "basic";
- if (RED.settings.httpRequestTimeout) { this.reqTimeout = parseInt(RED.settings.httpRequestTimeout) || 120000; }
- else { this.reqTimeout = 120000; }
-
- if (n.paytoqs === true || n.paytoqs === "query") { paytoqs = true; }
- else if (n.paytoqs === "body") { paytobody = true; }
-
+ node.ret = n.ret || "txt";
+ node.authType = n.authType || "basic";
+ if (RED.settings.httpRequestTimeout) { node.reqTimeout = parseInt(RED.settings.httpRequestTimeout) || 120000; }
+ else { node.reqTimeout = 120000; }
node.insecureHTTPParser = n.insecureHTTPParser
+ node.paytoqs = n.paytoqs
var prox, noprox;
if (process.env.http_proxy) { prox = process.env.http_proxy; }
@@ -196,20 +191,26 @@ in your Node-RED user directory (${RED.settings.userDir}).
}
}
- var method = nodeMethod.toUpperCase() || "GET";
+ let method = nodeMethod.toUpperCase() || "GET";
if (msg.method && n.method && (n.method !== "use")) { // warn if override option not set
node.warn(RED._("common.errors.nooverride"));
}
if (msg.method && n.method && (n.method === "use")) {
- method = msg.method.toUpperCase(); // use the msg parameter
+ method = msg.method.toUpperCase(); // use the msg parameter
}
+
+ /** @type {boolean|'query'|'body'|'setby'} */
+ let payloadHandling = node.paytoqs
+ if (msg.payloadHandling && payloadHandling && (payloadHandling !== "setby")) { // warn if override option not set
+ node.warn(RED._("common.errors.nooverride"));
+ }
+ if (msg.payloadHandling && payloadHandling && (payloadHandling === "setby")) {
+ payloadHandling = msg.payloadHandling // use the msg parameter
+ }
+ if (payloadHandling === true) { payloadHandling = "query" }
- // var isHttps = (/^https/i.test(url));
-
+ /** @type {import('got').Options} */
var opts = {};
- // set defaultport, else when using HttpsProxyAgent, it's defaultPort of 443 will be used :(.
- // Had to remove this to get http->https redirect to work
- // opts.defaultPort = isHttps?443:80;
opts.timeout = node.reqTimeout;
opts.throwHttpErrors = false;
// TODO: add UI option to auto decompress. Setting to false for 1.x compatibility
@@ -472,7 +473,7 @@ in your Node-RED user directory (${RED.settings.userDir}).
}
- if (method == 'GET' && typeof msg.payload !== "undefined" && paytoqs) {
+ if (method == "GET" && typeof msg.payload !== "undefined" && payloadHandling === "query") {
if (typeof msg.payload === "object") {
try {
if (url.indexOf("?") !== -1) {
@@ -481,18 +482,16 @@ in your Node-RED user directory (${RED.settings.userDir}).
url += "?" + querystring.stringify(msg.payload);
}
} catch(err) {
-
node.error(RED._("httpin.errors.invalid-payload"),msg);
nodeDone();
return;
}
} else {
-
node.error(RED._("httpin.errors.invalid-payload"),msg);
nodeDone();
return;
}
- } else if ( method == "GET" && typeof msg.payload !== "undefined" && paytobody) {
+ } else if ( method == "GET" && typeof msg.payload !== "undefined" && payloadHandling === "body") {
opts.allowGetBody = true;
if (typeof msg.payload === "object") {
opts.body = JSON.stringify(msg.payload);
diff --git a/packages/node_modules/@node-red/nodes/locales/de/messages.json b/packages/node_modules/@node-red/nodes/locales/de/messages.json
index 65f251e98..c09cced60 100644
--- a/packages/node_modules/@node-red/nodes/locales/de/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/de/messages.json
@@ -449,9 +449,11 @@
"headers": "Kopfzeilen",
"other": "andere",
"paytoqs": {
+ "label": "Payload (GET)",
"ignore": "Ignorieren",
"query": "Anfügen an query-string-Parameter",
- "body": "Senden als request-body"
+ "body": "Senden als request-body",
+ "setby": "Durch msg.payloadHandling festgelegt"
},
"utf8String": "UTF-8-String",
"binaryBuffer": "Binärer Buffer",
diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json
index 9c055d47b..d3813c576 100644
--- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json
@@ -513,9 +513,11 @@
"headers": "Headers",
"other": "other",
"paytoqs": {
+ "label": "Payload (GET)",
"ignore": "Ignore",
"query": "Append to query-string parameters",
- "body": "Send as request body"
+ "body": "Send as request body",
+ "setby": "- set by msg.payloadHandling -"
},
"utf8String": "UTF8 string",
"binaryBuffer": "binary buffer",
diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html b/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html
index b8d7fc048..4fb39ac71 100644
--- a/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html
+++ b/packages/node_modules/@node-red/nodes/locales/en-US/network/21-httprequest.html
@@ -30,6 +30,10 @@
If set, can be used to send cookies with the request.
payload
Sent as the body of the request.
+
payloadHandling string
+
Only valid with GET requests. If set to "- use msg.payloadHandling -" in the node configuration, this property
+ indicates how the payload will be sent. msg.payloadHandling should contain either
+ "query" or "body" otherwise the payload will not be sent with the GET request
rejectUnauthorized
If set to false, allows requests to be made to https sites that use
self signed certificates.
diff --git a/packages/node_modules/@node-red/nodes/locales/ja/messages.json b/packages/node_modules/@node-red/nodes/locales/ja/messages.json
index 76e5c65dd..0044d9729 100644
--- a/packages/node_modules/@node-red/nodes/locales/ja/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/ja/messages.json
@@ -513,9 +513,11 @@
"headers": "ヘッダ",
"other": "その他",
"paytoqs": {
+ "label": "ペイロード (GET)",
"ignore": "無視",
"query": "クエリパラメータに追加",
- "body": "リクエストボディとして送信"
+ "body": "リクエストボディとして送信",
+ "setby": "- msg.payloadHandlingに定義 -"
},
"utf8String": "UTF8文字列",
"binaryBuffer": "バイナリバッファ",
diff --git a/packages/node_modules/@node-red/nodes/locales/ko/messages.json b/packages/node_modules/@node-red/nodes/locales/ko/messages.json
index 15b7bee8e..2b0a88695 100644
--- a/packages/node_modules/@node-red/nodes/locales/ko/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/ko/messages.json
@@ -387,7 +387,13 @@
"status": "상태코드",
"headers": "헤더",
"other": "그 외",
- "paytoqs" : "msg.payload를 쿼리 파라미터에 추가",
+ "paytoqs": {
+ "label": "페이로드(GET)",
+ "ignore": "무시",
+ "query": "msg.payload를 쿼리 파라미터에 추가",
+ "body": "본문에 msg.payload 추가",
+ "setby": "- msg.payloadHandling에 의해 설정됨 -"
+ },
"utf8String": "UTF8문자열",
"binaryBuffer": "바이너리 버퍼",
"jsonObject": "JSON오브젝트",
diff --git a/packages/node_modules/@node-red/nodes/locales/ru/messages.json b/packages/node_modules/@node-red/nodes/locales/ru/messages.json
index 32364b458..b41be9457 100644
--- a/packages/node_modules/@node-red/nodes/locales/ru/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/ru/messages.json
@@ -411,9 +411,11 @@
"headers": "Заголовки",
"other": "другое",
"paytoqs": {
+ "label": "Данные (GET)",
"ignore": "Игнорировать",
"query": "Добавлять к параметрам строки запроса",
- "body": "Отправлять как тело запроса"
+ "body": "Отправлять как тело запроса",
+ "setby": "- устанавливается через msg.payloadHandling -"
},
"utf8String": "Строка UTF8",
"binaryBuffer": "двоичный буфер",
diff --git a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json
index b649163b7..7d3775f8f 100644
--- a/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/zh-CN/messages.json
@@ -407,7 +407,13 @@
"status": "状态码",
"headers": "头",
"other": "其他",
- "paytoqs": "将msg.payload附加为查询字符串参数",
+ "paytoqs": {
+ "label": "有效负载(仅限 GET)",
+ "ignore": "漠视",
+ "query": "将msg.payload附加为查询字符串参数",
+ "body": "在请求正文中发送负载",
+ "setby": "- 用 msg.payloadHandling 设定 -"
+ },
"utf8String": "UTF8格式的字符串",
"binaryBuffer": "二进制buffer",
"jsonObject": "解析的JSON对象",
diff --git a/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json
index d63c47865..63f358b17 100644
--- a/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json
+++ b/packages/node_modules/@node-red/nodes/locales/zh-TW/messages.json
@@ -411,7 +411,13 @@
"status": "狀態碼",
"headers": "Header",
"other": "其他",
- "paytoqs": "將msg.payload附加為查詢字符串參數",
+ "paytoqs": {
+ "label": "有效負載(僅限 GET)",
+ "ignore": "漠視",
+ "query": "將msg.payload附加為查詢字符串參數",
+ "body": "在請求正文中發送負載",
+ "setby": "- 用 msg.payloadHandling 設定 -"
+ },
"utf8String": "UTF8格式的字符串",
"binaryBuffer": "二進制buffer",
"jsonObject": "解析的JSON對象",
diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js
index c6c6ac4ac..2b21feb4a 100644
--- a/test/nodes/core/network/21-httprequest_spec.js
+++ b/test/nodes/core/network/21-httprequest_spec.js
@@ -294,6 +294,19 @@ describe('HTTP Request Node', function() {
url: req.originalUrl
});
})
+ testApp.get('/getBodyParams', function(req,res) {
+ // Either body-parser or express is discarding the body OR
+ // GOT never sent a body. (there is nothing in params/query/body)
+ // Oddly, if we set options.json (instead of options.body) in the GOT
+ // request, then req.body will have the values!
+ //I suspect the GOT lib *is* sending body on a GET request since an
+ // error is thrown if we try to set options.body on a GET request without
+ // setting options.allowGetBody to true.
+ res.json({
+ // body:JSON.parse(req.body), //req.body is empty!
+ url: req.originalUrl
+ });
+ })
testApp.get('/returnError/:code', function(req,res) {
res.status(parseInt(req.params.code)).json({gotError:req.params.code});
})
@@ -1117,6 +1130,89 @@ describe('HTTP Request Node', function() {
});
});
+ it('should allow the payload to be sent in the body for a GET request', function(done) {
+ var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"GET",paytoqs:"body",ret:"obj",url:getTestURL('/getBodyParams')},
+ {id:"n2", type:"helper"}];
+ helper.load(httpRequestNode, flow, function() {
+ var n1 = helper.getNode("n1");
+ var n2 = helper.getNode("n2");
+ const payload = {a:"one",b:true,c:3}
+ n2.on("input", function(msg) {
+ try {
+ // Either Express does not deliver the body of a GET request OR GOT doesn't send it!
+ // That means we cannot test this! Oddly, if the HTTP-Req node sets options.json instead
+ // of options.body, then the body is delivered.
+ // msg.should.have.property('payload',{
+ // body:payload,
+ // url: '/getBodyParams'
+ // });
+ msg.should.have.property('payload').and.be.an.Object()
+ msg.payload.should.have.property('url', '/getBodyParams')
+
+ msg.should.have.property('statusCode',200);
+ msg.should.have.property('headers');
+ done();
+ } catch(err) {
+ done(err);
+ }
+ });
+ n1.receive({payload:payload});
+ });
+ });
+
+ it('should allow the message to specify that the payload be append to querystring for a GET request', function(done) {
+ var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"use",paytoqs:"setby",ret:"obj",url:getTestURL('/getQueryParams')},
+ {id:"n2", type:"helper"}];
+ helper.load(httpRequestNode, flow, function() {
+ var n1 = helper.getNode("n1");
+ var n2 = helper.getNode("n2");
+ n2.on("input", function(msg) {
+ try {
+ msg.should.have.property('payload',{
+ query:{a:'1',b:'2',c:'3'},
+ url: '/getQueryParams?a=1&b=2&c=3'
+ });
+ msg.should.have.property('statusCode',200);
+ msg.should.have.property('headers');
+ done();
+ } catch(err) {
+ done(err);
+ }
+ });
+ n1.receive({payload:{a:1,b:2,c:3},method:"get",payloadHandling:'query'});
+ });
+ });
+
+
+ it('should allow the message to specify that the payload be sent in the body for a GET request', function(done) {
+ var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"use",paytoqs:"setby",ret:"obj",url:getTestURL('/getBodyParams')},
+ {id:"n2", type:"helper"}];
+ helper.load(httpRequestNode, flow, function() {
+ var n1 = helper.getNode("n1");
+ var n2 = helper.getNode("n2");
+ const payload = {a:"one",b:true,c:3}
+ n2.on("input", function(msg) {
+ try {
+ // Either Express does not deliver the body of a GET request OR GOT doesn't send it!
+ // That means we cannot test this! Oddly, if the HTTP-Req node sets options.json instead
+ // of options.body, then the body is delivered.
+ // msg.should.have.property('payload',{
+ // payload: payload,
+ // url: '/getBodyParams'
+ // });
+ msg.should.have.property('payload').and.be.an.Object()
+ msg.payload.should.have.property('url', '/getBodyParams')
+ msg.should.have.property('statusCode',200);
+ msg.should.have.property('headers');
+ done();
+ } catch(err) {
+ done(err);
+ }
+ });
+ n1.receive({payload:payload,method:"get",payloadHandling:'body'});
+ });
+ });
+
it('should send a msg for non-2xx response status - 400', function(done) {
var flow = [{id:"n1",type:"http request",wires:[["n2"]],method:"GET",ret:"obj",url:getTestURL('/returnError/400')},
{id:"n2", type:"helper"}];