From bc283aa02507ea73e4b8186ad6d2ed7fff4c61f8 Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Fri, 1 Nov 2019 11:38:26 +0000 Subject: [PATCH] Catches bad objects being encoded, returning instead the error. Symptom- Observed that global context would not display in front end, the call returning 400. Traced to an object in global which cause encodeObject to except. This push catches that, and now global will display, but the object in question display as an error. --- .../node_modules/@node-red/util/lib/util.js | 241 ++++++++++-------- 1 file changed, 128 insertions(+), 113 deletions(-) diff --git a/packages/node_modules/@node-red/util/lib/util.js b/packages/node_modules/@node-red/util/lib/util.js index 69ed930bb..d40a4de05 100644 --- a/packages/node_modules/@node-red/util/lib/util.js +++ b/packages/node_modules/@node-red/util/lib/util.js @@ -652,130 +652,145 @@ function normaliseNodeTypeName(name) { * @memberof @node-red/util_util */ function encodeObject(msg,opts) { - var debuglength = 1000; - if (opts && opts.hasOwnProperty('maxLength')) { - debuglength = opts.maxLength; - } - var msgType = typeof msg.msg; - if (msg.msg instanceof Error) { - msg.format = "error"; - var errorMsg = {}; - if (msg.msg.name) { - errorMsg.name = msg.msg.name; + try { + var debuglength = 1000; + if (opts && opts.hasOwnProperty('maxLength')) { + debuglength = opts.maxLength; } - if (msg.msg.hasOwnProperty('message')) { - errorMsg.message = msg.msg.message; - } else { - errorMsg.message = msg.msg.toString(); - } - msg.msg = JSON.stringify(errorMsg); - } else if (msg.msg instanceof Buffer) { - msg.format = "buffer["+msg.msg.length+"]"; - msg.msg = msg.msg.toString('hex'); - if (msg.msg.length > debuglength) { - msg.msg = msg.msg.substring(0,debuglength); - } - } else if (msg.msg && msgType === 'object') { - try { - msg.format = msg.msg.constructor.name || "Object"; - // Handle special case of msg.req/res objects from HTTP In node - if (msg.format === "IncomingMessage" || msg.format === "ServerResponse") { + var msgType = typeof msg.msg; + if (msg.msg instanceof Error) { + msg.format = "error"; + var errorMsg = {}; + if (msg.msg.name) { + errorMsg.name = msg.msg.name; + } + if (msg.msg.hasOwnProperty('message')) { + errorMsg.message = msg.msg.message; + } else { + errorMsg.message = msg.msg.toString(); + } + msg.msg = JSON.stringify(errorMsg); + } else if (msg.msg instanceof Buffer) { + msg.format = "buffer["+msg.msg.length+"]"; + msg.msg = msg.msg.toString('hex'); + if (msg.msg.length > debuglength) { + msg.msg = msg.msg.substring(0,debuglength); + } + } else if (msg.msg && msgType === 'object') { + try { + msg.format = msg.msg.constructor.name || "Object"; + // Handle special case of msg.req/res objects from HTTP In node + if (msg.format === "IncomingMessage" || msg.format === "ServerResponse") { + msg.format = "Object"; + } + } catch(err) { msg.format = "Object"; } - } catch(err) { - msg.format = "Object"; - } - if (/error/i.test(msg.format)) { - msg.msg = JSON.stringify({ - name: msg.msg.name, - message: msg.msg.message - }); - } else { - var isArray = util.isArray(msg.msg); - if (isArray) { - msg.format = "array["+msg.msg.length+"]"; - if (msg.msg.length > debuglength) { - // msg.msg = msg.msg.slice(0,debuglength); - msg.msg = { - __enc__: true, - type: "array", - data: msg.msg.slice(0,debuglength), - length: msg.msg.length - } - } - } - if (isArray || (msg.format === "Object")) { - msg.msg = safeJSONStringify(msg.msg, function(key, value) { - if (key === '_req' || key === '_res') { - value = { - __enc__: true, - type: "internal" - } - } else if (value instanceof Error) { - value = value.toString() - } else if (util.isArray(value) && value.length > debuglength) { - value = { + if (/error/i.test(msg.format)) { + msg.msg = JSON.stringify({ + name: msg.msg.name, + message: msg.msg.message + }); + } else { + var isArray = util.isArray(msg.msg); + if (isArray) { + msg.format = "array["+msg.msg.length+"]"; + if (msg.msg.length > debuglength) { + // msg.msg = msg.msg.slice(0,debuglength); + msg.msg = { __enc__: true, type: "array", - data: value.slice(0,debuglength), - length: value.length - } - } else if (typeof value === 'string') { - if (value.length > debuglength) { - value = value.substring(0,debuglength)+"..."; - } - } else if (typeof value === 'function') { - value = { - __enc__: true, - type: "function" - } - } else if (typeof value === 'number') { - if (isNaN(value) || value === Infinity || value === -Infinity) { - value = { - __enc__: true, - type: "number", - data: value.toString() - } - } - } else if (value && value.constructor) { - if (value.type === "Buffer") { - value.__enc__ = true; - value.length = value.data.length; - if (value.length > debuglength) { - value.data = value.data.slice(0,debuglength); - } - } else if (value.constructor.name === "ServerResponse") { - value = "[internal]" - } else if (value.constructor.name === "Socket") { - value = "[internal]" + data: msg.msg.slice(0,debuglength), + length: msg.msg.length } } - return value; - }," "); - } else { - try { msg.msg = msg.msg.toString(); } - catch(e) { msg.msg = "[Type not printable]"; } + } + if (isArray || (msg.format === "Object")) { + msg.msg = safeJSONStringify(msg.msg, function(key, value) { + if (key === '_req' || key === '_res') { + value = { + __enc__: true, + type: "internal" + } + } else if (value instanceof Error) { + value = value.toString() + } else if (util.isArray(value) && value.length > debuglength) { + value = { + __enc__: true, + type: "array", + data: value.slice(0,debuglength), + length: value.length + } + } else if (typeof value === 'string') { + if (value.length > debuglength) { + value = value.substring(0,debuglength)+"..."; + } + } else if (typeof value === 'function') { + value = { + __enc__: true, + type: "function" + } + } else if (typeof value === 'number') { + if (isNaN(value) || value === Infinity || value === -Infinity) { + value = { + __enc__: true, + type: "number", + data: value.toString() + } + } + } else if (value && value.constructor) { + if (value.type === "Buffer") { + value.__enc__ = true; + value.length = value.data.length; + if (value.length > debuglength) { + value.data = value.data.slice(0,debuglength); + } + } else if (value.constructor.name === "ServerResponse") { + value = "[internal]" + } else if (value.constructor.name === "Socket") { + value = "[internal]" + } + } + return value; + }," "); + } else { + try { msg.msg = msg.msg.toString(); } + catch(e) { msg.msg = "[Type not printable]"; } + } + } + } else if (msgType === "function") { + msg.format = "function"; + msg.msg = "[function]" + } else if (msgType === "boolean") { + msg.format = "boolean"; + msg.msg = msg.msg.toString(); + } else if (msgType === "number") { + msg.format = "number"; + msg.msg = msg.msg.toString(); + } else if (msg.msg === null || msgType === "undefined") { + msg.format = (msg.msg === null)?"null":"undefined"; + msg.msg = "(undefined)"; + } else { + msg.format = "string["+msg.msg.length+"]"; + if (msg.msg.length > debuglength) { + msg.msg = msg.msg.substring(0,debuglength)+"..."; } } - } else if (msgType === "function") { - msg.format = "function"; - msg.msg = "[function]" - } else if (msgType === "boolean") { - msg.format = "boolean"; - msg.msg = msg.msg.toString(); - } else if (msgType === "number") { - msg.format = "number"; - msg.msg = msg.msg.toString(); - } else if (msg.msg === null || msgType === "undefined") { - msg.format = (msg.msg === null)?"null":"undefined"; - msg.msg = "(undefined)"; - } else { - msg.format = "string["+msg.msg.length+"]"; - if (msg.msg.length > debuglength) { - msg.msg = msg.msg.substring(0,debuglength)+"..."; + return msg; + } catch(e) { + msg.format = "error"; + var errorMsg = {}; + if (e.name) { + errorMsg.name = e.name; } + if (e.hasOwnProperty('message')) { + errorMsg.message = e.message; + } else { + errorMsg.message = e.toString(); + } + msg.msg = JSON.stringify(errorMsg); + return msg; } - return msg; } module.exports = {