about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn2/wqflask/external_errors.py6
-rw-r--r--gn2/wqflask/oauth2/request_utils.py11
2 files changed, 14 insertions, 3 deletions
diff --git a/gn2/wqflask/external_errors.py b/gn2/wqflask/external_errors.py
index c4e9a2c7..2b1389b9 100644
--- a/gn2/wqflask/external_errors.py
+++ b/gn2/wqflask/external_errors.py
@@ -7,7 +7,8 @@ class ExternalRequestError(Exception):
 
     def __init__(self,
                  externaluri: str,
-                 error: Exception):
+                 error: Exception,
+                 extrainfo: str = ""):
         """Initialise the error message."""
         self.errorid = uuid4()
         self.error = error
@@ -15,4 +16,5 @@ class ExternalRequestError(Exception):
         super().__init__(
             f"error-id: {self.errorid}: We got an error of type "
             f"'{type(error).__name__}' trying to access {externaluri}:\n\n "
-            f"{''.join(traceback.format_exception(error))}")
+            f"{''.join(traceback.format_exception(error))} " +
+            (f"\n\n{extrainfo}" if bool(extrainfo) else ""))
diff --git a/gn2/wqflask/oauth2/request_utils.py b/gn2/wqflask/oauth2/request_utils.py
index ade0923b..bd98aaf1 100644
--- a/gn2/wqflask/oauth2/request_utils.py
+++ b/gn2/wqflask/oauth2/request_utils.py
@@ -1,12 +1,15 @@
 """General request utilities"""
 from typing import Optional, Callable
 from urllib.parse import urljoin, urlparse
+from requests.exceptions import JSONDecodeError
 
 import simplejson
 from flask import (
     flash, request, url_for, redirect, Response, render_template,
     current_app as app)
 
+from gn2.wqflask.external_errors import ExternalRequestError
+
 from .client import SCOPE, oauth2_get
 
 def authserver_authorise_uri():
@@ -43,7 +46,13 @@ def process_error(error: Response,
             "error_description": msg,
             "status_code": error.status_code
         }
-    return {**error.json(), "status_code": error.status_code}
+    try:
+        return {**error.json(), "status_code": error.status_code}
+    except JSONDecodeError as exc:
+        raise ExternalRequestError(
+            error.url,
+            exc,
+            f"Could not parse error record into JSON:\n\n{error.content}")
 
 def request_error(response):
     app.logger.error(f"{response}: {response.url} [{response.status_code}]")