From c592891dde08efbcd08dfc65935fc6940146db6f Mon Sep 17 00:00:00 2001 From: Inga Lovinde <52715130+inga-lovinde@users.noreply.github.com> Date: Mon, 20 Feb 2017 17:23:12 +0300 Subject: [PATCH] JSON.parse errors handling in dotnetbuilderwrapper --- BuildServer/lib/tasks/dotnetbuilderwrapper.js | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/BuildServer/lib/tasks/dotnetbuilderwrapper.js b/BuildServer/lib/tasks/dotnetbuilderwrapper.js index 7feb445..cf97e14 100644 --- a/BuildServer/lib/tasks/dotnetbuilderwrapper.js +++ b/BuildServer/lib/tasks/dotnetbuilderwrapper.js @@ -16,12 +16,24 @@ const wrapBuilder = (builder, input, onExit) => { errorBuffer.write(data); }); - builder.on("exit", (code) => onExit(code, resultBuffer.getContentsAsString(), errorBuffer.getContentsAsString())); + builder.on("exit", (code) => { + resultBuffer.end(); + errorBuffer.end(); + onExit(code, resultBuffer.getContentsAsString(), errorBuffer.getContentsAsString()); + }); builder.stdin.write(input); builder.stdin.end(); }; +const safeParseJson = (data) => { + try { + return { "parsed": JSON.parse(data) }; + } catch (err) { + return { err }; + } +}; + module.exports = (params, processor) => ({ "process": () => { const input = JSON.stringify(params); @@ -29,15 +41,23 @@ module.exports = (params, processor) => ({ processor.onInfo(`DotNetBuilderWrapper processing (at ${new Date().toISOString()}): ${input}`); - wrapBuilder(builder, input, (code, result, error) => { - if (code) { - processor.onError(`Return code is ${code}\r\n${error}`); + wrapBuilder(builder, input, (code, result, builderError) => { + if (code || builderError) { + processor.onError(`Return code is ${code}\r\n${builderError}`); + + return processor.done(); + } + + const { parsed, err } = safeParseJson(result); + + if (err || !parsed || !parsed.Messages) { + processor.onError(`Malformed JSON: ${err}`); + processor.onInfo(result); return processor.done(); } - const report = JSON.parse(result); - const messages = report.Messages; + const messages = parsed.Messages; messages.forEach((message) => { if (!message) {