Ошибка валидации: 422 без эха тела запроса вместо 500
Если JSON-эндпойнт получал тело с Content-Type text/plain (так шлёт HTML-форма), сервер отвечал 500. _validation_handler клал exc.errors() в details как есть, а в input там лежало сырое тело типа bytes, которое JSONResponse не сериализует. Затронуты все эндпойнты с телом, в том числе /api/auth/telegram и /api/admin/auth/login. Запрос и раньше отклонялся, сессия не создавалась, но вместо понятной 422 в логе появлялся трейсбек. Тот же input возвращал клиенту тело запроса целиком. Неполная форма входа отправляла пароль обратно в ответе 422, откуда он мог осесть в логах прокси и инструментах отладки. Теперь в details идут только type, loc и msg. input и ctx (там бывают объекты исключений — та же проблема сериализации) в ответ не попадают. Конверт и код VALIDATION_ERROR прежние, фронт details валидации не читает. Тесты: text/plain на двух эндпойнтах даёт 422, пароль не возвращается, loc по-прежнему указывает на поле. На старом коде первые два падают. #52 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XfTsytzT6TojfmprRDKiV6
This commit is contained in:
+5
-1
@@ -177,13 +177,17 @@ def create_app() -> FastAPI:
|
||||
|
||||
@app.exception_handler(RequestValidationError)
|
||||
async def _validation_handler(_request: Request, exc: RequestValidationError) -> JSONResponse:
|
||||
# Только type/loc/msg. В input лежит тело запроса: эхо паролей в ответ, а для тела
|
||||
# не в JSON (text/plain от HTML-формы) — сырые bytes, которые JSON не сериализует,
|
||||
# и ответ падал в 500. В ctx бывают объекты исключений — та же проблема.
|
||||
details = [{"type": e["type"], "loc": e["loc"], "msg": e["msg"]} for e in exc.errors()]
|
||||
return JSONResponse(
|
||||
status_code=422,
|
||||
content={
|
||||
"error": {
|
||||
"code": "VALIDATION_ERROR",
|
||||
"message": "Ошибка валидации запроса.",
|
||||
"details": exc.errors(),
|
||||
"details": details,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user