From ead56cdf49d64dc659def0857de1b096a964e532 Mon Sep 17 00:00:00 2001 From: Paul Melnikow <github@paulmelnikow.com> Date: Wed, 24 Jul 2019 22:07:23 -0500 Subject: [PATCH] [DynamicJson] Catch jsonpath parse error (#3776) Closes #3772 --- services/dynamic/dynamic-json.service.js | 15 +++++++++++++-- services/dynamic/dynamic-json.tester.js | 10 ++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/services/dynamic/dynamic-json.service.js b/services/dynamic/dynamic-json.service.js index af27ef069d..edb2eaa3c1 100644 --- a/services/dynamic/dynamic-json.service.js +++ b/services/dynamic/dynamic-json.service.js @@ -4,7 +4,7 @@ const Joi = require('@hapi/joi') const jp = require('jsonpath') const { renderDynamicBadge, errorMessages } = require('../dynamic-common') const { createRoute } = require('./dynamic-helpers') -const { BaseJsonService, InvalidResponse } = require('..') +const { BaseJsonService, InvalidParameter, InvalidResponse } = require('..') module.exports = class DynamicJson extends BaseJsonService { static get category() { @@ -28,7 +28,18 @@ module.exports = class DynamicJson extends BaseJsonService { errorMessages, }) - const values = jp.query(data, pathExpression) + let values + try { + values = jp.query(data, pathExpression) + } catch (e) { + if (e.message.startsWith('Lexical error')) { + throw new InvalidParameter({ + prettyMessage: 'unparseable jsonpath query', + }) + } else { + throw e + } + } if (!values.length) { throw new InvalidResponse({ prettyMessage: 'no result' }) diff --git a/services/dynamic/dynamic-json.tester.js b/services/dynamic/dynamic-json.tester.js index 605748af2a..a879636e80 100644 --- a/services/dynamic/dynamic-json.tester.js +++ b/services/dynamic/dynamic-json.tester.js @@ -139,3 +139,13 @@ t.create('JSON from url | request should set Accept header') .after(() => { expect(headers).to.have.property('accept', 'application/json') }) + +t.create('JSON from url | invalid query') + .get( + '.json?url=https://github.com/badges/shields/raw/master/package.json&query=$[?' + ) + .expectBadge({ + label: 'custom badge', + message: 'unparseable jsonpath query', + color: 'red', + }) -- GitLab