From b7c2b0bc93cbedd58185c0aa996cae4610419994 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 7 Aug 2025 17:39:54 +0800 Subject: [PATCH] perf: Assistant cors config --- backend/apps/system/api/assistant.py | 3 ++- backend/common/utils/utils.py | 23 +++++++++++++++++++++++ backend/pyproject.toml | 2 +- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/backend/apps/system/api/assistant.py b/backend/apps/system/api/assistant.py index fe9303e5..89b9c660 100644 --- a/backend/apps/system/api/assistant.py +++ b/backend/apps/system/api/assistant.py @@ -12,6 +12,7 @@ from common.core.sqlbot_cache import clear_cache from common.utils.time import get_timestamp from starlette.middleware.cors import CORSMiddleware from common.core.config import settings +from common.utils.utils import get_origin_from_referer router = APIRouter(tags=["system/assistant"], prefix="/system/assistant") @router.get("/info/{id}") @@ -23,7 +24,7 @@ async def info(request: Request, response: Response, session: SessionDep, trans: raise RuntimeError(f"assistant application not exist") db_model = AssistantModel.model_validate(db_model) response.headers["Access-Control-Allow-Origin"] = db_model.domain - origin = request.headers.get("origin") or request.headers.get("referer") + origin = request.headers.get("origin") or get_origin_from_referer(request) origin = origin.rstrip('/') if origin != db_model.domain: raise RuntimeError(trans('i18n_embedded.invalid_origin', origin = origin or '')) diff --git a/backend/common/utils/utils.py b/backend/common/utils/utils.py index 9e14f652..cea2a95e 100644 --- a/backend/common/utils/utils.py +++ b/backend/common/utils/utils.py @@ -6,6 +6,9 @@ import logging from datetime import datetime, timedelta, timezone from logging.handlers import RotatingFileHandler from pathlib import Path +from urllib.parse import urlparse + +from fastapi import Request from common.core.config import settings from typing import Optional @@ -240,4 +243,24 @@ def prepare_model_arg(origin_arg: str): return json.loads(origin_arg) except: return origin_arg + +def get_origin_from_referer(request: Request): + referer = request.headers.get("referer") + if not referer: + return None + + try: + parsed = urlparse(referer) + if not parsed.scheme or not parsed.hostname: + return None + port = parsed.port + if port: + if (parsed.scheme == "http" and port != 80) or \ + (parsed.scheme == "https" and port != 443): + return f"{parsed.scheme}://{parsed.hostname}:{port}" + + return f"{parsed.scheme}://{parsed.hostname}" + except Exception as e: + SQLBotLogUtil.error(f"解析 Referer 出错: {e}") + return referer diff --git a/backend/pyproject.toml b/backend/pyproject.toml index d9397f39..53680a0b 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "sqlbot" -version = "0.1.0" +version = "1.0.0" description = "" requires-python = ">=3.10,<3.13" dependencies = [