From 1740ccbe30946aa6693a6a9ed8211a2ff7cfbf3d Mon Sep 17 00:00:00 2001 From: Frederick Muriuki Muriithi Date: Wed, 9 Jul 2025 11:51:37 -0500 Subject: Improve error handling and reporting. - Refactor out common functionality into reusable utilities - Handle errors from the Authlib library/package - Handle 4xx errors generically. --- gn_auth/errors/common.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 gn_auth/errors/common.py (limited to 'gn_auth/errors/common.py') diff --git a/gn_auth/errors/common.py b/gn_auth/errors/common.py new file mode 100644 index 0000000..7ef18cf --- /dev/null +++ b/gn_auth/errors/common.py @@ -0,0 +1,41 @@ +"""Common utilities.""" +import logging +import traceback + +from flask import request, jsonify, render_template + +logger = logging.getLogger(__name__) + + +def add_trace(exc: Exception, errobj: dict) -> dict: + """Add the traceback to the error handling object.""" + return { + **errobj, + "error-trace": "".join(traceback.format_exception(exc)) + } + + +def build_handler(description: str): + """Generic utility to build error handlers.""" + def __handler__(exc: Exception): + error = (exc.name if hasattr(exc, "name") else exc.__class__.__name__) + status_code = exc.code if hasattr(exc, "code") else 500 + content_type = request.content_type + if bool(content_type) and content_type.lower() == "application/json": + return ( + jsonify(add_trace(exc, + { + "requested-uri": request.url, + "error": error, + "error_description": description + })), + status_code) + + return (render_template(f"http-error-{str(status_code)[0:-2]}xx.html", + error=exc, + page=request.url, + description=description, + trace=traceback.format_exception(exc)), + status_code) + + return __handler__ -- cgit v1.2.3