diff --git a/api/controllers/console/auth/login.py b/api/controllers/console/auth/login.py index c3a6794d1..a5ad6a1cd 100644 --- a/api/controllers/console/auth/login.py +++ b/api/controllers/console/auth/login.py @@ -221,7 +221,7 @@ class EmailCodeLoginApi(Resource): email=user_email, name=user_email, interface_language=languages[0] ) except WorkSpaceNotAllowedCreateError: - return NotAllowedCreateWorkspace() + raise NotAllowedCreateWorkspace() except AccountRegisterError as are: raise AccountInFreezeError() except WorkspacesLimitExceededError: diff --git a/api/libs/external_api.py b/api/libs/external_api.py index ed07eb9a9..95d13cd0e 100644 --- a/api/libs/external_api.py +++ b/api/libs/external_api.py @@ -1,10 +1,10 @@ import re import sys +from collections.abc import Mapping from typing import Any from flask import current_app, got_request_exception from flask_restx import Api -from werkzeug.datastructures import Headers from werkzeug.exceptions import HTTPException from werkzeug.http import HTTP_STATUS_CODES @@ -12,125 +12,97 @@ from core.errors.error import AppInvokeQuotaExceededError def http_status_message(code): - """Maps an HTTP status code to the textual status""" return HTTP_STATUS_CODES.get(code, "") def register_external_error_handlers(api: Api) -> None: - """Register error handlers for the API using decorators. - - :param api: The Flask-RestX Api instance - """ - @api.errorhandler(HTTPException) def handle_http_exception(e: HTTPException): - """Handle HTTP exceptions.""" got_request_exception.send(current_app, exception=e) - if e.response is not None: - return e.get_response() + # If Werkzeug already prepared a Response, just use it. + if getattr(e, "response", None) is not None: + return e.response - headers = Headers() - status_code = e.code + status_code = getattr(e, "code", 500) or 500 + + # Build a safe, dict-like payload default_data = { "code": re.sub(r"(?