Fix: Merge URL query parameters instead of replacing them#3759
Open
veeceey wants to merge 4 commits intoencode:masterfrom
Open
Fix: Merge URL query parameters instead of replacing them#3759veeceey wants to merge 4 commits intoencode:masterfrom
veeceey wants to merge 4 commits intoencode:masterfrom
Conversation
When a URL contains query parameters and additional params are passed via
the params argument, the original URL parameters were being dropped instead
of being merged together. This was inconsistent with requests library behavior.
This fix modifies the URL.__init__() to merge existing query parameters from
the URL with new parameters from the params argument, rather than replacing
them. When the same key exists in both, the new params take precedence.
Examples:
- URL("https://api.com/get?page=1", params={"size": 10})
Before: https://api.com/get?size=10 (page lost)
After: https://api.com/get?page=1&size=10 (merged)
- URL("https://api.com/get?a=old", params={"a": "new"})
After: https://api.com/get?a=new (overridden)
Fixes encode#3621
Updated URL.__init__ to properly handle QueryParams objects vs dict params: - When params is a QueryParams object (from copy_remove_param, etc), use it directly without merging - When params is a dict/list, merge with existing URL query parameters - Updated test expectations to reflect merge behavior instead of replacement This fixes the copy_remove_param test failure while maintaining the intended merge behavior for user-provided params, matching requests library behavior.
Removed the else branch handling when url is neither str nor URL, as the type hint enforces url: URL | str. This was unreachable defensive code that was causing a coverage gap.
Author
|
All CI passing on Python 3.9-3.13, ready for merge |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #3621
When a URL already contains query parameters and additional
paramsare passed, httpx was dropping the original URL parameters instead of merging them. This was inconsistent with therequestslibrary behavior.Problem
Solution
Modified
URL.__init__()in_urls.pyto:paramsargumentChanges
httpx/_urls.py: Updated param handling to merge instead of replacetests/models/test_url.pyTest Cases
Merge existing and new params:
Override with same key:
Empty params preserves existing:
No existing params works normally:
Testing