Skip to content

Commit 38fe19f

Browse files
committed
Merge params with existing URL query parameters instead of replacing them
When a URL already contains query parameters and the `params` argument is also provided, the existing query parameters are now merged with the new ones instead of being silently dropped. This aligns with the behavior of the `requests` library and matches user expectations. Fixes #3621
1 parent ae1b9f6 commit 38fe19f

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

httpx/_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def __init__(
396396
extensions: RequestExtensions | None = None,
397397
) -> None:
398398
self.method = method.upper()
399-
self.url = URL(url) if params is None else URL(url, params=params)
399+
self.url = URL(url) if params is None else URL(url).copy_merge_params(params)
400400
self.headers = Headers(headers)
401401
self.extensions = {} if extensions is None else dict(extensions)
402402

tests/models/test_requests.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,18 @@ def test_request_params():
232232
request = httpx.Request("GET", "http://example.com", params={})
233233
assert str(request.url) == "http://example.com"
234234

235+
# Params are merged with existing URL query parameters, not replaced.
235236
request = httpx.Request(
236237
"GET", "http://example.com?c=3", params={"a": "1", "b": "2"}
237238
)
238-
assert str(request.url) == "http://example.com?a=1&b=2"
239+
assert str(request.url) == "http://example.com?c=3&a=1&b=2"
239240

241+
# Empty params preserves existing URL query parameters.
240242
request = httpx.Request("GET", "http://example.com?a=1", params={})
241-
assert str(request.url) == "http://example.com"
243+
assert str(request.url) == "http://example.com?a=1"
244+
245+
# Params with overlapping keys override existing URL query parameters.
246+
request = httpx.Request(
247+
"GET", "http://example.com?a=1&b=2", params={"b": "3", "c": "4"}
248+
)
249+
assert str(request.url) == "http://example.com?a=1&b=3&c=4"

0 commit comments

Comments
 (0)