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 <lball@redhat.com>
This commit is contained in:
Lance Ball 2021-05-12 17:57:31 -04:00
parent 0c17ff3af4
commit 82a5f070b5
No known key found for this signature in database
GPG Key ID: DB1D2F8DCDB4EE5C
2 changed files with 20 additions and 2 deletions

View File

@ -17,6 +17,15 @@ export class JSONParser implements Parser {
* @return {object} the parsed JSON payload.
*/
parse(payload: Record<string, unknown> | 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.
const r = /^[[|{|"]/;
if (!r.test(payload)) {
payload = `"${payload}"`;
}
}
if (this.decorator) {
payload = this.decorator.parse(payload);
}

View File

@ -47,11 +47,20 @@ 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();
// TODO: Should the parser catch the SyntaxError and re-throw a ValidationError?
expect(parser.parse(payload)).to.equal("I am a string!");
});
it("Must accept when the payload is a string well formed as JSON", () => {