diff --git a/BuildServer/lib/builder.ts b/BuildServer/lib/builder.ts index 09181a5..422e3c8 100644 --- a/BuildServer/lib/builder.ts +++ b/BuildServer/lib/builder.ts @@ -4,6 +4,7 @@ import { join } from "path"; import { exists, readFile, writeFileSync } from "fs"; import { mkdirsSync, remove } from "fs-extra"; import { parallel, queue } from "async"; +import * as JSONParse from "json-parse-safe"; import { gitLoader } from "./git/loader"; import { processTask } from "./task-processor"; import { writeReport } from "./report-processor"; @@ -62,14 +63,6 @@ const wrapGitLoader = (skipGitLoader) => { return (gitLoaderOptions, gitLoaderCallback) => process.nextTick(gitLoaderCallback); }; -const safeParseJson = (data):any => { - try { - return { "parsed": JSON.parse(data) }; - } catch (err) { - return { err }; - } -}; - export const build = (options, buildCallback) => { const url = options.url; const owner = options.owner; @@ -187,15 +180,15 @@ export const build = (options, buildCallback) => { return done(readErr, "MBSUnableToRead"); } - const { parsed, err } = safeParseJson(data); + const { value, error } = JSONParse(data); - if (err) { + if (error) { console.log(`Malformed data: ${data}`); - return done(err, "MBSMalformed"); + return done(error, "MBSMalformed"); } - return processTask(parsed, { + return processTask(value, { branch, exported, owner, diff --git a/BuildServer/lib/report-processor.ts b/BuildServer/lib/report-processor.ts index 7216e9d..b11014b 100644 --- a/BuildServer/lib/report-processor.ts +++ b/BuildServer/lib/report-processor.ts @@ -6,6 +6,7 @@ import { createGzip, createGunzip } from "zlib"; import * as glob from "glob"; import { ReadableStreamBuffer, WritableStreamBuffer } from "stream-buffers"; import * as _ from "underscore"; +import * as JSONParse from "json-parse-safe"; const reportFilename = "report.json.gz"; const maxAttemptsNumber = 100; @@ -62,12 +63,16 @@ export const readReport = (releaseDir, callback) => { readStream.destroy(); const data = writable.getContentsAsString(); - if (!data) { return callback("ReportFileNotFound"); } - return callback(null, JSON.parse(data)); + const { error, value } = JSONParse(data); + if (error) { + return callback("ReportFileMalformed"); + } + + return callback(null, value); }); }; diff --git a/BuildServer/lib/tasks/dotnetbuilderwrapper.ts b/BuildServer/lib/tasks/dotnetbuilderwrapper.ts index 144a46d..dc9fa78 100644 --- a/BuildServer/lib/tasks/dotnetbuilderwrapper.ts +++ b/BuildServer/lib/tasks/dotnetbuilderwrapper.ts @@ -2,6 +2,7 @@ import { spawn } from "child_process"; import { WritableStreamBuffer } from "stream-buffers"; +import * as JSONParse from "json-parse-safe"; import settings from "../../settings"; const wrapBuilder = (builder, input, onExit) => { @@ -26,14 +27,6 @@ const wrapBuilder = (builder, input, onExit) => { builder.stdin.end(); }; -const safeParseJson = (data):any => { - try { - return { "parsed": JSON.parse(data) }; - } catch (err) { - return { err }; - } -}; - export default (params, processor) => ({ "process": () => { const input = JSON.stringify(params); @@ -48,16 +41,16 @@ export default (params, processor) => ({ return processor.done(); } - const { parsed, err } = safeParseJson(result); + const { value, error } = JSONParse(result); - if (err || !parsed || !parsed.Messages) { - processor.onError(`Malformed JSON: ${err}`); + if (error || !value || !value.Messages) { + processor.onError(`Malformed JSON: ${error}`); processor.onInfo(result); return processor.done(); } - const messages = parsed.Messages; + const messages = value.Messages; messages.forEach((message) => { if (!message) { diff --git a/BuildServer/package.json b/BuildServer/package.json index ccdda39..ae07877 100644 --- a/BuildServer/package.json +++ b/BuildServer/package.json @@ -19,6 +19,7 @@ "glob": "~7.1.1", "graceful-fs": "^4.1.11", "jade": "*", + "json-parse-safe": "^1.0.3", "method-override": "^2.3.7", "morgan": "^1.7.0", "mustache": "~2.3.0", diff --git a/BuildServer/routes/postreceive.ts b/BuildServer/routes/postreceive.ts index 591d19f..ab68958 100644 --- a/BuildServer/routes/postreceive.ts +++ b/BuildServer/routes/postreceive.ts @@ -1,5 +1,6 @@ "use strict"; +import * as JSONParse from "json-parse-safe"; import { build } from "../lib/builder"; import { commentOnPullRequest } from "../lib/commenter"; @@ -90,13 +91,21 @@ const processPullRequest = (req, res, payload) => { ); }; +const getPayload = (body) => { + if (!body.payload) { + return body; + } + + return JSONParse(body.payload).value; +} + export default (req, res) => { if (!req.body || (!req.body.payload && !req.body.repository)) { return res.end(); } const eventType = req.header("x-github-event"); - const payload = (req.body.payload && JSON.parse(req.body.payload)) || req.body; + const payload = getPayload(req.body); if (eventType === "push") { return processPush(req, res, payload);