From 3bc31f10b2b2d4460c62366013278d87665f0f97 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Mon, 3 Mar 2025 19:16:18 +0000 Subject: [PATCH] Simplified urldecode logic --- src/microdot/microdot.py | 24 +++++------------------- tests/test_urlencode.py | 6 +++--- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/src/microdot/microdot.py b/src/microdot/microdot.py index a21467e..119096e 100644 --- a/src/microdot/microdot.py +++ b/src/microdot/microdot.py @@ -57,7 +57,9 @@ MUTED_SOCKET_ERRORS = [ ] -def urldecode_str(s): +def urldecode(s): + if isinstance(s, bytes): + s = s.decode() s = s.replace('+', ' ') parts = s.split('%') if len(parts) == 1: @@ -73,22 +75,6 @@ def urldecode_str(s): return ''.join(result) -def urldecode_bytes(s): - s = s.replace(b'+', b' ') - parts = s.split(b'%') - if len(parts) == 1: - return s.decode() - result = [parts[0]] - for item in parts[1:]: - if item == b'': - result.append(b'%') - else: - code = item[:2] - result.append(bytes([int(code, 16)])) - result.append(item[2:]) - return b''.join(result).decode() - - def urlencode(s): return s.replace('+', '%2B').replace(' ', '+').replace( '%', '%25').replace('?', '%3F').replace('#', '%23').replace( @@ -441,12 +427,12 @@ class Request: if isinstance(urlencoded, str): for kv in [pair.split('=', 1) for pair in urlencoded.split('&') if pair]: - data[urldecode_str(kv[0])] = urldecode_str(kv[1]) \ + data[urldecode(kv[0])] = urldecode(kv[1]) \ if len(kv) > 1 else '' elif isinstance(urlencoded, bytes): # pragma: no branch for kv in [pair.split(b'=', 1) for pair in urlencoded.split(b'&') if pair]: - data[urldecode_bytes(kv[0])] = urldecode_bytes(kv[1]) \ + data[urldecode(kv[0])] = urldecode(kv[1]) \ if len(kv) > 1 else b'' return data diff --git a/tests/test_urlencode.py b/tests/test_urlencode.py index db21d85..a32e8d4 100644 --- a/tests/test_urlencode.py +++ b/tests/test_urlencode.py @@ -1,5 +1,5 @@ import unittest -from microdot.microdot import urlencode, urldecode_str, urldecode_bytes +from microdot.microdot import urlencode, urldecode class TestURLEncode(unittest.TestCase): @@ -7,5 +7,5 @@ class TestURLEncode(unittest.TestCase): self.assertEqual(urlencode('?foo=bar&x'), '%3Ffoo%3Dbar%26x') def test_urldecode(self): - self.assertEqual(urldecode_str('%3Ffoo%3Dbar%26x'), '?foo=bar&x') - self.assertEqual(urldecode_bytes(b'%3Ffoo%3Dbar%26x'), '?foo=bar&x') + self.assertEqual(urldecode('%3Ffoo%3Dbar%26x'), '?foo=bar&x') + self.assertEqual(urldecode(b'%3Ffoo%3Dbar%26x'), '?foo=bar&x')