Skip to content

Commit feac39d

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

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/stagehand/_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
@@ -505,6 +505,30 @@ def test_default_query_option(self) -> None:
505505

506506
client.close()
507507

508+
def test_hardcoded_query_params_in_url(self, client: Stagehand) -> None:
509+
request = client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
510+
url = httpx.URL(request.url)
511+
assert dict(url.params) == {"beta": "true"}
512+
513+
request = client._build_request(
514+
FinalRequestOptions(
515+
method="get",
516+
url="/foo?beta=true",
517+
params={"limit": "10", "page": "abc"},
518+
)
519+
)
520+
url = httpx.URL(request.url)
521+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
522+
523+
request = client._build_request(
524+
FinalRequestOptions(
525+
method="get",
526+
url="/files/a%2Fb?beta=true",
527+
params={"limit": "10"},
528+
)
529+
)
530+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
531+
508532
def test_request_extra_json(self, client: Stagehand) -> None:
509533
request = client._build_request(
510534
FinalRequestOptions(
@@ -1552,6 +1576,30 @@ async def test_default_query_option(self) -> None:
15521576

15531577
await client.close()
15541578

1579+
async def test_hardcoded_query_params_in_url(self, async_client: AsyncStagehand) -> None:
1580+
request = async_client._build_request(FinalRequestOptions(method="get", url="/foo?beta=true"))
1581+
url = httpx.URL(request.url)
1582+
assert dict(url.params) == {"beta": "true"}
1583+
1584+
request = async_client._build_request(
1585+
FinalRequestOptions(
1586+
method="get",
1587+
url="/foo?beta=true",
1588+
params={"limit": "10", "page": "abc"},
1589+
)
1590+
)
1591+
url = httpx.URL(request.url)
1592+
assert dict(url.params) == {"beta": "true", "limit": "10", "page": "abc"}
1593+
1594+
request = async_client._build_request(
1595+
FinalRequestOptions(
1596+
method="get",
1597+
url="/files/a%2Fb?beta=true",
1598+
params={"limit": "10"},
1599+
)
1600+
)
1601+
assert request.url.raw_path == b"/files/a%2Fb?beta=true&limit=10"
1602+
15551603
def test_request_extra_json(self, client: Stagehand) -> None:
15561604
request = client._build_request(
15571605
FinalRequestOptions(

0 commit comments

Comments
 (0)