From fcc7b4ec8c8c7a29e52890fd02aaeb046611d1ff Mon Sep 17 00:00:00 2001 From: Doug Yee Date: Thu, 23 Jan 2020 10:32:21 -0600 Subject: [PATCH 1/2] When encoding URLs, don't encode iterables twice --- asks/request_object.py | 5 ++--- tests/test_request_object.py | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/asks/request_object.py b/asks/request_object.py index 2f4a7ae..873f7e0 100644 --- a/asks/request_object.py +++ b/asks/request_object.py @@ -440,9 +440,8 @@ def _dict_to_query(data, params=True, base_query=False): query.append('='.join(quote_plus(x) for x in (k, key))) elif hasattr(v, '__iter__'): for elm in v: - query.append('='.join(quote_plus(x) for x in (k, - quote_plus('+'.join(str(elm).split()))))) - + elm_quoted = "+".join(quote_plus(str(y)) for y in elm.split()) + query.append("=".join((quote_plus(k), elm_quoted))) if params and query: if not base_query: return requote_uri('?' + '&'.join(query)) diff --git a/tests/test_request_object.py b/tests/test_request_object.py index 9627a99..0f4e5a4 100644 --- a/tests/test_request_object.py +++ b/tests/test_request_object.py @@ -40,6 +40,8 @@ def test_http1_0(monkeypatch): [{'zero': 0}, '?zero=0'], [{'empty': ''}, '?empty='], [{'false': False}, '?false=False'], + [{'foo': 'abc', 'bar': 'jkl'}, '?foo=abc&bar=jkl'], + [{'foo': ['abc def', 'ghi'], 'bar baz': 'jkl'}, '?foo=abc+def&foo=ghi&bar+baz=jkl'], ]) def test_dict_to_query(data, query_str): assert RequestProcessor._dict_to_query(data) == query_str From faa9954088f28b8cd585292359f9f20286b45cb8 Mon Sep 17 00:00:00 2001 From: Doug Yee Date: Tue, 4 Feb 2020 13:06:27 -0600 Subject: [PATCH 2/2] Handle non-string elements in iterables --- asks/request_object.py | 12 ++++++++---- tests/test_request_object.py | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/asks/request_object.py b/asks/request_object.py index 873f7e0..2a2a80e 100644 --- a/asks/request_object.py +++ b/asks/request_object.py @@ -440,13 +440,17 @@ def _dict_to_query(data, params=True, base_query=False): query.append('='.join(quote_plus(x) for x in (k, key))) elif hasattr(v, '__iter__'): for elm in v: - elm_quoted = "+".join(quote_plus(str(y)) for y in elm.split()) - query.append("=".join((quote_plus(k), elm_quoted))) + if elm is None: + continue + try: + elm_quoted = '+'.join(quote_plus(str(y)) for y in elm.split()) + except AttributeError: # not a string + elm_quoted = str(elm) + query.append('='.join((quote_plus(k), elm_quoted))) if params and query: if not base_query: return requote_uri('?' + '&'.join(query)) - else: - return requote_uri('&' + '&'.join(query)) + return requote_uri('&' + '&'.join(query)) return requote_uri('&'.join(query)) diff --git a/tests/test_request_object.py b/tests/test_request_object.py index 0f4e5a4..b5cb85e 100644 --- a/tests/test_request_object.py +++ b/tests/test_request_object.py @@ -42,6 +42,7 @@ def test_http1_0(monkeypatch): [{'false': False}, '?false=False'], [{'foo': 'abc', 'bar': 'jkl'}, '?foo=abc&bar=jkl'], [{'foo': ['abc def', 'ghi'], 'bar baz': 'jkl'}, '?foo=abc+def&foo=ghi&bar+baz=jkl'], + [{'foo bar': 5, 'baz': [123, 456], 'qux': ['abc', 789, None]}, '?foo+bar=5&baz=123&baz=456&qux=abc&qux=789'] ]) def test_dict_to_query(data, query_str): assert RequestProcessor._dict_to_query(data) == query_str