Handle query string arguments without value (Fixes #149)

This commit is contained in:
Miguel Grinberg
2023-06-21 20:20:53 +01:00
parent 51f910087a
commit 3554bc91cb
3 changed files with 18 additions and 14 deletions

View File

@@ -404,13 +404,15 @@ class Request():
data = MultiDict()
if len(urlencoded) > 0:
if isinstance(urlencoded, str):
for k, v in [pair.split('=', 1)
for pair in urlencoded.split('&') if pair]:
data[urldecode_str(k)] = urldecode_str(v)
for kv in [pair.split('=', 1)
for pair in urlencoded.split('&') if pair]:
data[urldecode_str(kv[0])] = urldecode_str(kv[1]) \
if len(kv) > 1 else ''
elif isinstance(urlencoded, bytes): # pragma: no branch
for k, v in [pair.split(b'=', 1)
for pair in urlencoded.split(b'&') if pair]:
data[urldecode_bytes(k)] = urldecode_bytes(v)
for kv in [pair.split(b'=', 1)
for pair in urlencoded.split(b'&') if pair]:
data[urldecode_bytes(kv[0])] = urldecode_bytes(kv[1]) \
if len(kv) > 1 else b''
return data
@property

View File

@@ -39,11 +39,12 @@ class TestRequest(unittest.TestCase):
self.assertEqual(req.body, b'aaa')
def test_args(self):
fd = get_request_fd('GET', '/?foo=bar&abc=def&x=%2f%%')
fd = get_request_fd('GET', '/?foo=bar&abc=def&foo&x=%2f%%')
req = Request.create('app', fd, 'addr')
self.assertEqual(req.query_string, 'foo=bar&abc=def&x=%2f%%')
self.assertEqual(req.args, MultiDict(
{'foo': 'bar', 'abc': 'def', 'x': '/%%'}))
self.assertEqual(req.query_string, 'foo=bar&abc=def&foo&x=%2f%%')
md = MultiDict({'foo': 'bar', 'abc': 'def', 'x': '/%%'})
md['foo'] = ''
self.assertEqual(req.args, md)
def test_badly_formatted_args(self):
fd = get_request_fd('GET', '/?&foo=bar&abc=def&&&x=%2f%%')

View File

@@ -49,11 +49,12 @@ class TestRequestAsync(unittest.TestCase):
self.assertEqual(req.body, b'aaa')
def test_args(self):
fd = get_async_request_fd('GET', '/?foo=bar&abc=def&x=%2f%%')
fd = get_async_request_fd('GET', '/?foo=bar&abc=def&foo&x=%2f%%')
req = _run(Request.create('app', fd, 'writer', 'addr'))
self.assertEqual(req.query_string, 'foo=bar&abc=def&x=%2f%%')
self.assertEqual(req.args, MultiDict(
{'foo': 'bar', 'abc': 'def', 'x': '/%%'}))
self.assertEqual(req.query_string, 'foo=bar&abc=def&foo&x=%2f%%')
md = MultiDict({'foo': 'bar', 'abc': 'def', 'x': '/%%'})
md['foo'] = ''
self.assertEqual(req.args, md)
def test_json(self):
fd = get_async_request_fd('GET', '/foo', headers={