From 9dbb6e4e263b26c01c117d3b23a7de78eeccc810 Mon Sep 17 00:00:00 2001 From: cnlimiter Date: Mon, 16 Mar 2026 01:13:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(services):=20=E4=BF=AE=E5=A4=8DPOST?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E9=87=8D=E5=AE=9A=E5=90=91=E6=97=B6=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=B8=A2=E5=A4=B1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/custom_domain.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/services/custom_domain.py b/src/services/custom_domain.py index db96b8a..ab2476a 100644 --- a/src/services/custom_domain.py +++ b/src/services/custom_domain.py @@ -113,7 +113,32 @@ class CustomDomainEmailService(BaseEmailService): kwargs["headers"].update(self._get_headers()) try: - response = self.http_client.request(method, url, **kwargs) + # POST 请求禁用自动重定向,手动处理以保持 POST 方法(避免 HTTP→HTTPS 重定向时被转为 GET) + if method.upper() == "POST": + kwargs["allow_redirects"] = False + response = self.http_client.request(method, url, **kwargs) + # 处理重定向 + max_redirects = 5 + redirect_count = 0 + while response.status_code in (301, 302, 303, 307, 308) and redirect_count < max_redirects: + location = response.headers.get("Location", "") + if not location: + break + import urllib.parse as _urlparse + redirect_url = _urlparse.urljoin(url, location) + # 307/308 保持 POST,其余(301/302/303)转为 GET + if response.status_code in (307, 308): + redirect_method = method + redirect_kwargs = kwargs + else: + redirect_method = "GET" + # GET 不传 body + redirect_kwargs = {k: v for k, v in kwargs.items() if k not in ("json", "data")} + response = self.http_client.request(redirect_method, redirect_url, **redirect_kwargs) + url = redirect_url + redirect_count += 1 + else: + response = self.http_client.request(method, url, **kwargs) if response.status_code >= 400: error_msg = f"API 请求失败: {response.status_code}"