From db4be6b1da479f27903efc6694d06f7cc8b054e2 Mon Sep 17 00:00:00 2001 From: Lance Ball Date: Thu, 13 May 2021 12:46:36 -0400 Subject: [PATCH] src: be more forgiving parsing JSON as a string (#417) * src: be more forgiving parsing JSON as a string A simple string is considered valid JSON. However, our parsers do not accept that unless the string has quotation marks. This commit modifies the parser to look for strings declared as application/json which do not begin with '[' '{' or '"' and surrounds them with quotes. Signed-off-by: Lance Ball --- src/parsers.ts | 8 ++++++++ test/integration/parser_test.ts | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/parsers.ts b/src/parsers.ts index 37890e0..c70d043 100644 --- a/src/parsers.ts +++ b/src/parsers.ts @@ -17,6 +17,14 @@ export class JSONParser implements Parser { * @return {object} the parsed JSON payload. */ parse(payload: Record | string): string { + if (typeof payload === "string") { + // This is kind of a hack, but the payload data could be JSON in the form of a single + // string, such as "some data". But without the quotes in the string, JSON.parse blows + // up. We can check for this scenario and add quotes. Not sure if this is ideal. + if (!/^[[|{|"]/.test(payload)) { + payload = `"${payload}"`; + } + } if (this.decorator) { payload = this.decorator.parse(payload); } diff --git a/test/integration/parser_test.ts b/test/integration/parser_test.ts index b5d678a..ea7f67c 100644 --- a/test/integration/parser_test.ts +++ b/test/integration/parser_test.ts @@ -47,11 +47,19 @@ describe("JSON Event Format Parser", () => { it("Throw error when payload is an invalid JSON", () => { // setup - const payload = "gg"; + const payload = "{gg"; const parser = new Parser(); // TODO: Should the parser catch the SyntaxError and re-throw a ValidationError? - expect(parser.parse.bind(parser, payload)).to.throw(SyntaxError, "Unexpected token g in JSON at position 0"); + expect(parser.parse.bind(parser, payload)).to.throw(SyntaxError, "Unexpected token g in JSON at position 1"); + }); + + it("Accepts a string as valid JSON", () => { + // setup + const payload = "I am a string!"; + const parser = new Parser(); + + expect(parser.parse(payload)).to.equal("I am a string!"); }); it("Must accept when the payload is a string well formed as JSON", () => {