about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gn3/errors.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/gn3/errors.py b/gn3/errors.py
index ec0088d..3a2f781 100644
--- a/gn3/errors.py
+++ b/gn3/errors.py
@@ -1,7 +1,17 @@
 """Handle application level errors."""
 import traceback
 
+from http.client import RemoteDisconnected
+from urllib.error import URLError
 from sqlite3 import OperationalError
+from SPARQLWrapper.SPARQLExceptions import (
+    EndPointInternalError,
+    EndPointNotFound,
+    QueryBadFormed,
+    SPARQLWrapperException,
+    URITooLong,
+    Unauthorized
+)
 from werkzeug.exceptions import NotFound
 from flask import Flask, jsonify, current_app
 from authlib.oauth2.rfc6749.errors import OAuth2Error
@@ -15,6 +25,7 @@ def add_trace(exc: Exception, jsonmsg: dict) -> dict:
         "error-trace": "".join(traceback.format_exception(exc))
     }
 
+
 def page_not_found(pnf):
     """Generic 404 handler."""
     return jsonify(add_trace(pnf, {
@@ -22,6 +33,14 @@ def page_not_found(pnf):
         "error_description": pnf.description
     })), 404
 
+def internal_server_error(pnf):
+    """Generic 404 handler."""
+    return jsonify(add_trace(pnf, {
+        "error": pnf.name,
+        "error_description": pnf.description
+    })), 500
+
+
 def handle_authorisation_error(exc: AuthorisationError):
     """Handle AuthorisationError if not handled anywhere else."""
     current_app.logger.error(exc)
@@ -46,9 +65,35 @@ def handle_sqlite3_errors(exc: OperationalError):
         "error_description": exc.args[0],
     }), 500
 
+def handle_sparql_errors(exc: SPARQLWrapperException):
+    """Handle sqlite3 errors if not handled anywhere else."""
+    current_app.logger.error(exc)
+    __code = {
+        EndPointInternalError: 500,
+        EndPointNotFound: 400,
+        QueryBadFormed: 400,
+        Unauthorized: 401,
+        URITooLong: 414,
+    }
+    return jsonify({
+        "error": exc.msg,
+        "error_description": str(exc),
+    }), __code.get(exc)
+
+
 def register_error_handlers(app: Flask):
     """Register application-level error handlers."""
     app.register_error_handler(NotFound, page_not_found)
     app.register_error_handler(OAuth2Error, handle_oauth2_errors)
     app.register_error_handler(OperationalError, handle_sqlite3_errors)
     app.register_error_handler(AuthorisationError, handle_authorisation_error)
+    app.register_error_handler(RemoteDisconnected, internal_server_error)
+    app.register_error_handler(URLError, internal_server_error)
+    for exc in (
+            EndPointInternalError,
+            EndPointNotFound,
+            QueryBadFormed,
+            URITooLong,
+            Unauthorized
+    ):
+        app.register_error_handler(exc, handle_sparql_errors)