urldecoding should always be done in bytes

This commit is contained in:
Miguel Grinberg
2025-03-16 20:31:06 +00:00
parent 00bf535821
commit d203df75fe

View File

@@ -58,21 +58,21 @@ MUTED_SOCKET_ERRORS = [
def urldecode(s): def urldecode(s):
if isinstance(s, bytes): if isinstance(s, str):
s = s.decode() s = s.encode()
s = s.replace('+', ' ') s = s.replace(b'+', b' ')
parts = s.split('%') parts = s.split(b'%')
if len(parts) == 1: if len(parts) == 1:
return s return s.decode()
result = [parts[0]] result = [parts[0]]
for item in parts[1:]: for item in parts[1:]:
if item == '': if item == b'':
result.append('%') result.append(b'%')
else: else:
code = item[:2] code = item[:2]
result.append(chr(int(code, 16))) result.append(bytes([int(code, 16)]))
result.append(item[2:]) result.append(item[2:])
return ''.join(result) return b''.join(result).decode()
def urlencode(s): def urlencode(s):