Skip to content

Commit 2cda6ae

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent ed80ce0 commit 2cda6ae

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/tabstack/_base_client.py

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

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

430430
client.close()
431431

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

13331357
await client.close()
13341358

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

0 commit comments

Comments
 (0)