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