fix(url): normalize base url path without corrupting query and fragment (#45647)

This commit is contained in:
ChengFa authored and GitHub committed 2026-11-10 05:17:01 +00:00
1 parent 9fbd9dcd33
commit 644f8b7c08
2 files changed
+22 -1

No files matched your search

+4 -1
View File
@@ -3,7 +3,10 @@ from urllib.parse import urlsplit, urlunsplit
def normalize_api_base_url(base_url: str) -> str:
"""Normalize a base URL to always end with /v1, avoiding double /v1 suffixes."""
return base_url.rstrip("/").removesuffix("/v1").rstrip("/") + "/v1"
base_url = base_url.strip()
parsed = urlsplit(base_url)
path = parsed.path.rstrip("/").removesuffix("/v1").rstrip("/") + "/v1"
return urlunsplit(parsed._replace(path=path))
def github_blob_to_raw_url(url: str) -> str:
@@ -0,0 +1,18 @@
from libs.url_utils import normalize_api_base_url
def test_normalize_api_base_url_appends_v1() -> None:
assert normalize_api_base_url("https://api.example.com") == "https://api.example.com/v1"
assert normalize_api_base_url("https://api.example.com/") == "https://api.example.com/v1"
assert normalize_api_base_url("https://api.example.com/v1") == "https://api.example.com/v1"
assert normalize_api_base_url("https://api.example.com/v1/") == "https://api.example.com/v1"
def test_normalize_api_base_url_preserves_query_and_fragment() -> None:
assert normalize_api_base_url("https://api.example.com/v1?timeout=30") == "https://api.example.com/v1?timeout=30"
assert normalize_api_base_url("https://api.example.com?timeout=30") == "https://api.example.com/v1?timeout=30"
assert normalize_api_base_url("https://api.example.com/v1#section") == "https://api.example.com/v1#section"
def test_normalize_api_base_url_strips_surrounding_whitespace() -> None:
assert normalize_api_base_url(" https://api.example.com/v1 ") == "https://api.example.com/v1"