Skip to content

Commit 70761a4

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent 832318c commit 70761a4

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/writerai/_base_client.py

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

544544
prepared_url = self._prepare_url(options.url)
545+
# preserve hard-coded query params from the url
546+
if params and prepared_url.query:
547+
params = {**dict(prepared_url.params.items()), **params}
548+
prepared_url = prepared_url.copy_with(raw_path=prepared_url.raw_path.split(b"?", 1)[0])
545549
if "_" in prepared_url.host:
546550
# work around https://github.com/encode/httpx/discussions/2880
547551
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
@@ -428,6 +428,30 @@ def test_default_query_option(self) -> None:
428428

429429
client.close()
430430

431+
def test_hardcoded_query_params_in_url(self, client: Writer) -> None:
432+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
433+
url = httpx.URL(request.url)
434+
assert dict(url.params) == {"beta": "true"}
435+
436+
request = client._build_request(
437+
FinalRequestOptions(
438+
method="get",
439+
url="/foo?beta=true",
440+
params={"limit": "10", "page": "abc"},
441+
)
442+
)
443+
url = httpx.URL(request.url)
444+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
445+
446+
request = client._build_request(
447+
FinalRequestOptions(
448+
method="get",
449+
url="/files/a%2Fb?beta=true",
450+
params={"limit": "10"},
451+
)
452+
)
453+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
454+
431455
def test_request_extra_json(self, client: Writer) -> None:
432456
request = client._build_request(
433457
FinalRequestOptions(
@@ -1334,6 +1358,30 @@ async def test_default_query_option(self) -> None:
13341358

13351359
await client.close()
13361360

1361+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncWriter) -> None:
1362+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1363+
url = httpx.URL(request.url)
1364+
assert dict(url.params) == {"beta": "true"}
1365+
1366+
request = async_client._build_request(
1367+
FinalRequestOptions(
1368+
method="get",
1369+
url="/foo?beta=true",
1370+
params={"limit": "10", "page": "abc"},
1371+
)
1372+
)
1373+
url = httpx.URL(request.url)
1374+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1375+
1376+
request = async_client._build_request(
1377+
FinalRequestOptions(
1378+
method="get",
1379+
url="/files/a%2Fb?beta=true",
1380+
params={"limit": "10"},
1381+
)
1382+
)
1383+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1384+
13371385
def test_request_extra_json(self, client: Writer) -> None:
13381386
request = client._build_request(
13391387
FinalRequestOptions(

0 commit comments

Comments
 (0)