]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Preserve list type query paramaters when merging QueryParams objects (#546) (#547)
authorCasey <kcen@users.noreply.github.com>
Sat, 30 Nov 2019 15:35:10 +0000 (07:35 -0800)
committerTom Christie <tom@tomchristie.com>
Sat, 30 Nov 2019 15:35:09 +0000 (15:35 +0000)
httpx/models.py
tests/models/test_queryparams.py

index 0b14734d2868ee86cb4a42f11a1be2616ecc0155..e703e2da4864f7ecb204f98210b2cf14b614bc6b 100644 (file)
@@ -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]
index 1303170d00dabfbf07e3339b32d9e19dffcb949b..0b0101cb310d97d1fbb4bf1f4acbf74ad4ac8c4e 100644 (file)
@@ -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"]