From 9df76ccfe97d4df57a5dad832ef137d68282b432 Mon Sep 17 00:00:00 2001 From: Casey Date: Sat, 30 Nov 2019 07:35:10 -0800 Subject: [PATCH] Preserve list type query paramaters when merging QueryParams objects (#546) (#547) --- httpx/models.py | 7 ++++++- tests/models/test_queryparams.py | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/httpx/models.py b/httpx/models.py index 0b14734d..e703e2da 100644 --- a/httpx/models.py +++ b/httpx/models.py @@ -345,7 +345,12 @@ class QueryParams(typing.Mapping[str, str]): params = QueryParams(params) for param in params: - self[param] = params[param] + item, *extras = params.getlist(param) + self[param] = item + if extras: + self._list.extend((param, e) for e in extras) + # ensure getter matches merged QueryParams getter + self._dict[param] = params[param] def __getitem__(self, key: typing.Any) -> str: return self._dict[key] diff --git a/tests/models/test_queryparams.py b/tests/models/test_queryparams.py index 1303170d..0b0101cb 100644 --- a/tests/models/test_queryparams.py +++ b/tests/models/test_queryparams.py @@ -62,6 +62,9 @@ def test_queryparam_types(): q = QueryParams({"a": 123}) assert str(q) == "a=123" + q = QueryParams({"a": [1, 2]}) + assert str(q) == "a=1&a=2" + def test_queryparam_setters(): q = QueryParams({"a": 1}) @@ -72,3 +75,10 @@ def test_queryparam_setters(): q = QueryParams([("a", 1), ("a", 2)]) q["a"] = "3" assert str(q) == "a=3" + + q = QueryParams([("a", 1), ("b", 1)]) + u = QueryParams([("b", 2), ("b", 3)]) + q.update(u) + + assert str(q) == "a=1&b=2&b=3" + assert q["b"] == u["b"]