Commit 350f574

benny-dou <60535774+benny-dou@users.noreply.github.com>
2025-02-17 05:16:49
fix: refine redirect url handling
1 parent b245389
Changed files (1)
src/networking.py
@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 
 import asyncio
+import contextlib
 import json
 import re
 from pathlib import Path
@@ -408,23 +409,21 @@ async def flatten_rediercts(texts: str | None = None, pattern: str | None = None
         return texts
     # parse redirect
     headers = {"user-agent": UA.TELEGRAM} if headers is None else headers
-    try:
-        new_url = https_url(url)
+    rediercted_url = https_url(url)
+    with contextlib.suppress(Exception):
         if method == "HEAD":
             async with AsyncClient(http2=True, proxy=proxy, follow_redirects=True, event_hooks={"request": [log_req], "response": [log_resp]}) as hx:
-                resp = await hx.head(new_url, headers=headers, timeout=3)
+                resp = await hx.head(https_url(url), headers=headers, timeout=3)
+                rediercted_url = str(resp.url)
         elif method == "GET":
             status_code = 302
             while str(status_code).startswith("3"):
                 async with AsyncClient(http2=True, proxy=proxy, follow_redirects=False, event_hooks={"request": [log_req], "response": [log_resp]}) as hx:
-                    resp = await hx.get(new_url, headers=headers, timeout=3)
+                    resp = await hx.get(rediercted_url, headers=headers, timeout=3)
                     status_code = resp.status_code
-                    new_url = resp.headers.get("Location", new_url)
-    except Exception as e:
-        logger.error(f"Failed to parse redirect for {url}: {e}")
-        return texts
-    rediercted_url = str(resp.url)  # type: ignore
-    logger.info(f"Flatten redirect: {url} -> {rediercted_url}")
+                    rediercted_url = resp.headers.get("Location", rediercted_url)
+    if url != rediercted_url:
+        logger.info(f"Flatten redirect: {url} -> {rediercted_url}")
     return texts.replace(url, rediercted_url)