"""
请求工具函数

解决 Windows 中文系统（GBK 编码）下 request.json() 解码 UTF-8 失败的问题。
Python 3.11 的 json.loads(bytes) 在 GBK 系统上调 detect_encoding()，
可能把 UTF-8 字节误判为 GBK，导致 UnicodeDecodeError。

用法：
    from ...utils.request_utils import safe_json
    body = await safe_json(request)
"""
import json
from fastapi import Request


async def safe_json(request: Request):
    """安全地解析请求体为 JSON，强制使用 UTF-8 解码，兼容 Windows 中文系统"""
    raw = await request.body()
    # 关键：先手动用 UTF-8 解码成字符串，再传给 json.loads(str)
    # 避免 json.loads(bytes) 在 GBK 系统上误用 GBK 解码
    if isinstance(raw, (bytes, bytearray)):
        text = raw.decode('utf-8')
    else:
        text = raw
    return json.loads(text)
