Skip to content

Commit 3a94db2

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent 1f40e79 commit 3a94db2

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/keycardai_api/_base_client.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,10 @@ def _build_request(
558558
files = cast(HttpxRequestFiles, ForceMultipartDict())
559559

560560
prepared_url = self._prepare_url(options.url)
561+
# preserve hard-coded query params from the url
562+
if params and prepared_url.query:
563+
params = {**dict(prepared_url.params.items()), **params}
564+
prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
561565
if "_" in prepared_url.host:
562566
# work around https://github.com/encode/httpx/discussions/2880
563567
kwargs["extensions"] = {"sni_hostname": prepared_url.host.replace("_", "-")}

tests/test_client.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,30 @@ def test_default_query_option(self) -> None:
458458

459459
client.close()
460460

461+
def test_hardcoded_query_params_in_url(self, client: KeycardAPI) -> None:
462+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
463+
url = httpx.URL(request.url)
464+
assert dict(url.params) == {"beta": "true"}
465+
466+
request = client._build_request(
467+
FinalRequestOptions(
468+
method="get",
469+
url="/foo?beta=true",
470+
params={"limit": "10", "page": "abc"},
471+
)
472+
)
473+
url = httpx.URL(request.url)
474+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
475+
476+
request = client._build_request(
477+
FinalRequestOptions(
478+
method="get",
479+
url="/files/a%2Fb?beta=true",
480+
params={"limit": "10"},
481+
)
482+
)
483+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
484+
461485
def test_request_extra_json(self, client: KeycardAPI) -> None:
462486
request = client._build_request(
463487
FinalRequestOptions(
@@ -1415,6 +1439,30 @@ async def test_default_query_option(self) -> None:
14151439

14161440
await client.close()
14171441

1442+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncKeycardAPI) -> None:
1443+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1444+
url = httpx.URL(request.url)
1445+
assert dict(url.params) == {"beta": "true"}
1446+
1447+
request = async_client._build_request(
1448+
FinalRequestOptions(
1449+
method="get",
1450+
url="/foo?beta=true",
1451+
params={"limit": "10", "page": "abc"},
1452+
)
1453+
)
1454+
url = httpx.URL(request.url)
1455+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1456+
1457+
request = async_client._build_request(
1458+
FinalRequestOptions(
1459+
method="get",
1460+
url="/files/a%2Fb?beta=true",
1461+
params={"limit": "10"},
1462+
)
1463+
)
1464+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1465+
14181466
def test_request_extra_json(self, client: KeycardAPI) -> None:
14191467
request = client._build_request(
14201468
FinalRequestOptions(

0 commit comments

Comments
 (0)