Skip to content

Commit ac91863

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent 370e1a0 commit ac91863

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/anthropic/_base_client.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -553,12 +553,10 @@ def _build_request(
553553
files = cast(HttpxRequestFiles, ForceMultipartDict())
554554

555555
prepared_url = self._prepare_url(options.url)
556-
# When the URL contains hardcoded query params (e.g. ?beta=true) and
557-
# additional params are provided, httpx will replace the URL's query
558-
# string with the params. Merge them to preserve both.
556+
# preserve hard-coded query params from the url
559557
if params and prepared_url.query:
560558
params = {**dict(prepared_url.params.items()), **params}
561-
prepared_url = prepared_url.copy_with(raw_path=prepared_url.path.encode())
559+
prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
562560
if "_" in prepared_url.host:
563561
# work around https://github.com/encode/httpx/discussions/2880
564562
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}

tests/test_client.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,6 @@ def test_hardcoded_query_params_in_url(self, client: Anthropic) -> None:
458458
url = httpx.URL(request.url)
459459
assert dict(url.params) == {"beta": "true"}
460460

461-
def test_hardcoded_query_params_with_extra_params(self, client: Anthropic) -> None:
462461
request = client._build_request(
463462
FinalRequestOptions(
464463
method="get",
@@ -469,6 +468,15 @@ def test_hardcoded_query_params_with_extra_params(self, client: Anthropic) -> No
469468
url = httpx.URL(request.url)
470469
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
471470

471+
request = client._build_request(
472+
FinalRequestOptions(
473+
method="get",
474+
url="/files/a%2Fb?beta=true",
475+
params={"limit": "10"},
476+
)
477+
)
478+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
479+
472480
def test_request_extra_json(self, client: Anthropic) -> None:
473481
request = client._build_request(
474482
FinalRequestOptions(
@@ -1474,12 +1482,11 @@ async def test_default_query_option(self) -> None:
14741482

14751483
await client.close()
14761484

1477-
def test_hardcoded_query_params_in_url(self, async_client: AsyncAnthropic) -> None:
1485+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncAnthropic) -> None:
14781486
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
14791487
url = httpx.URL(request.url)
14801488
assert dict(url.params) == {"beta": "true"}
14811489

1482-
def test_hardcoded_query_params_with_extra_params(self, async_client: AsyncAnthropic) -> None:
14831490
request = async_client._build_request(
14841491
FinalRequestOptions(
14851492
method="get",
@@ -1490,6 +1497,15 @@ def test_hardcoded_query_params_with_extra_params(self, async_client: AsyncAnthr
14901497
url = httpx.URL(request.url)
14911498
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
14921499

1500+
request = async_client._build_request(
1501+
FinalRequestOptions(
1502+
method="get",
1503+
url="/files/a%2Fb?beta=true",
1504+
params={"limit": "10"},
1505+
)
1506+
)
1507+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1508+
14931509
def test_request_extra_json(self, client: Anthropic) -> None:
14941510
request = client._build_request(
14951511
FinalRequestOptions(

0 commit comments

Comments
 (0)