Skip to content

Commit fa95230

Browse files
fix(client): preserve hardcoded query params when merging with user params
1 parent 90d7e14 commit fa95230

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

src/onebusaway/_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
@@ -420,6 +420,30 @@ def test_default_query_option(self) -> None:
420420

421421
client.close()
422422

423+
def test_hardcoded_query_params_in_url(self, client: OnebusawaySDK) -> None:
424+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
425+
url = httpx.URL(request.url)
426+
assert dict(url.params) == {"beta": "true"}
427+
428+
request = client._build_request(
429+
FinalRequestOptions(
430+
method="get",
431+
url="/foo?beta=true",
432+
params={"limit": "10", "page": "abc"},
433+
)
434+
)
435+
url = httpx.URL(request.url)
436+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
437+
438+
request = client._build_request(
439+
FinalRequestOptions(
440+
method="get",
441+
url="/files/a%2Fb?beta=true",
442+
params={"limit": "10"},
443+
)
444+
)
445+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
446+
423447
def test_request_extra_json(self, client: OnebusawaySDK) -> None:
424448
request = client._build_request(
425449
FinalRequestOptions(
@@ -1314,6 +1338,30 @@ async def test_default_query_option(self) -> None:
13141338
url = httpx.URL(request.url)
13151339
assert dict(url.params) == {"foo": "baz", "query_param": "overridden", "key": api_key}
13161340

1341+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncOnebusawaySDK) -> None:
1342+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1343+
url = httpx.URL(request.url)
1344+
assert dict(url.params) == {"beta": "true"}
1345+
1346+
request = async_client._build_request(
1347+
FinalRequestOptions(
1348+
method="get",
1349+
url="/foo?beta=true",
1350+
params={"limit": "10", "page": "abc"},
1351+
)
1352+
)
1353+
url = httpx.URL(request.url)
1354+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1355+
1356+
request = async_client._build_request(
1357+
FinalRequestOptions(
1358+
method="get",
1359+
url="/files/a%2Fb?beta=true",
1360+
params={"limit": "10"},
1361+
)
1362+
)
1363+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1364+
13171365
def test_request_extra_json(self, client: OnebusawaySDK) -> None:
13181366
request = client._build_request(
13191367
FinalRequestOptions(

0 commit comments

Comments
 (0)