Skip to content

Commit a2ee006

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent 0be42f6 commit a2ee006

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/steel/_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
@@ -392,6 +392,30 @@ def test_default_query_option(self) -> None:
392392

393393
client.close()
394394

395+
def test_hardcoded_query_params_in_url(self, client: Steel) -> None:
396+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
397+
url = httpx.URL(request.url)
398+
assert dict(url.params) == {"beta": "true"}
399+
400+
request = client._build_request(
401+
FinalRequestOptions(
402+
method="get",
403+
url="/foo?beta=true",
404+
params={"limit": "10", "page": "abc"},
405+
)
406+
)
407+
url = httpx.URL(request.url)
408+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
409+
410+
request = client._build_request(
411+
FinalRequestOptions(
412+
method="get",
413+
url="/files/a%2Fb?beta=true",
414+
params={"limit": "10"},
415+
)
416+
)
417+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
418+
395419
def test_request_extra_json(self, client: Steel) -> None:
396420
request = client._build_request(
397421
FinalRequestOptions(
@@ -1241,6 +1265,30 @@ async def test_default_query_option(self) -> None:
12411265

12421266
await client.close()
12431267

1268+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncSteel) -> None:
1269+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1270+
url = httpx.URL(request.url)
1271+
assert dict(url.params) == {"beta": "true"}
1272+
1273+
request = async_client._build_request(
1274+
FinalRequestOptions(
1275+
method="get",
1276+
url="/foo?beta=true",
1277+
params={"limit": "10", "page": "abc"},
1278+
)
1279+
)
1280+
url = httpx.URL(request.url)
1281+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1282+
1283+
request = async_client._build_request(
1284+
FinalRequestOptions(
1285+
method="get",
1286+
url="/files/a%2Fb?beta=true",
1287+
params={"limit": "10"},
1288+
)
1289+
)
1290+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1291+
12441292
def test_request_extra_json(self, client: Steel) -> None:
12451293
request = client._build_request(
12461294
FinalRequestOptions(

0 commit comments

Comments
 (0)