diff --git a/backend/danswer/main.py b/backend/danswer/main.py index 8b660f5a9..14b0f3fe3 100644 --- a/backend/danswer/main.py +++ b/backend/danswer/main.py @@ -1,4 +1,5 @@ import time +import traceback from collections.abc import AsyncGenerator from contextlib import asynccontextmanager from typing import Any @@ -8,6 +9,7 @@ import uvicorn from fastapi import APIRouter from fastapi import FastAPI from fastapi import Request +from fastapi import status from fastapi.exceptions import RequestValidationError from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse @@ -407,11 +409,32 @@ async def lifespan(app: FastAPI) -> AsyncGenerator: yield +def log_http_error(_: Request, exc: Exception) -> JSONResponse: + status_code = getattr(exc, "status_code", 500) + if status_code >= 400: + error_msg = f"{str(exc)}\n" + error_msg += "".join(traceback.format_tb(exc.__traceback__)) + logger.error(error_msg) + return JSONResponse( + status_code=status_code, + content={"detail": str(exc)}, + ) + + def get_application() -> FastAPI: application = FastAPI( title="Danswer Backend", version=__version__, lifespan=lifespan ) + # Add the custom exception handler + application.add_exception_handler(status.HTTP_400_BAD_REQUEST, log_http_error) + application.add_exception_handler(status.HTTP_401_UNAUTHORIZED, log_http_error) + application.add_exception_handler(status.HTTP_403_FORBIDDEN, log_http_error) + application.add_exception_handler(status.HTTP_404_NOT_FOUND, log_http_error) + application.add_exception_handler( + status.HTTP_500_INTERNAL_SERVER_ERROR, log_http_error + ) + include_router_with_global_prefix_prepended(application, chat_router) include_router_with_global_prefix_prepended(application, query_router) include_router_with_global_prefix_prepended(application, document_router) diff --git a/backend/danswer/server/manage/users.py b/backend/danswer/server/manage/users.py index 620ddd3b4..d2fd981b5 100644 --- a/backend/danswer/server/manage/users.py +++ b/backend/danswer/server/manage/users.py @@ -69,7 +69,7 @@ def set_user_role( if user_role_update_request.new_role == UserRole.CURATOR: raise HTTPException( - status_code=402, + status_code=400, detail="Curator role must be set via the User Group Menu", ) @@ -78,7 +78,7 @@ def set_user_role( if current_user.id == user_to_update.id: raise HTTPException( - status_code=402, + status_code=400, detail="An admin cannot demote themselves from admin role!", ) diff --git a/backend/ee/danswer/db/user_group.py b/backend/ee/danswer/db/user_group.py index 998587fa2..00e7d4d5e 100644 --- a/backend/ee/danswer/db/user_group.py +++ b/backend/ee/danswer/db/user_group.py @@ -51,14 +51,14 @@ def validate_user_creation_permissions( detail = "User does not have permission to create public credentials" logger.error(detail) raise HTTPException( - status_code=402, + status_code=400, detail=detail, ) if not target_group_ids: detail = "Curators must specify 1+ groups" logger.error(detail) raise HTTPException( - status_code=402, + status_code=400, detail=detail, ) user_curated_groups = fetch_user_groups_for_user( @@ -70,7 +70,7 @@ def validate_user_creation_permissions( detail = "Curators cannot control groups they don't curate" logger.error(detail) raise HTTPException( - status_code=402, + status_code=400, detail=detail, )