From 5bf516a7f1f971a59a26d7cf153db777d502e659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vlastimil=20Z=C3=ADma?= Date: Thu, 2 Jul 2020 13:36:19 +0200 Subject: [PATCH] Fix urinorm - return plain sub delimiters in path, refs #41 --- openid/test/test_urinorm.py | 8 +++++++- openid/urinorm.py | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/openid/test/test_urinorm.py b/openid/test/test_urinorm.py index 2c7aa0c5..53debfe3 100644 --- a/openid/test/test_urinorm.py +++ b/openid/test/test_urinorm.py @@ -71,11 +71,17 @@ def test_path_percent_encoding(self): self.assertEqual(urinorm('http://example.com/Λ'), 'http://example.com/%CE%9B') def test_path_capitalize_percent_encoding(self): - self.assertEqual(urinorm('http://example.com/foo%2cbar'), 'http://example.com/foo%2Cbar') + self.assertEqual(urinorm('http://example.com/foo%3abar'), 'http://example.com/foo%3Abar') def test_path_percent_decode_unreserved(self): self.assertEqual(urinorm('http://example.com/foo%2Dbar%2dbaz'), 'http://example.com/foo-bar-baz') + def test_path_keep_sub_delims(self): + self.assertEqual(urinorm('http://example.com/foo+!bar'), 'http://example.com/foo+!bar') + + def test_path_percent_decode_sub_delims(self): + self.assertEqual(urinorm('http://example.com/foo%2B%21bar'), 'http://example.com/foo+!bar') + def test_illegal_characters(self): six.assertRaisesRegex(self, ValueError, 'Illegal characters in URI', urinorm, 'http://.com/') diff --git a/openid/urinorm.py b/openid/urinorm.py index 6a5a5883..0ee010ac 100644 --- a/openid/urinorm.py +++ b/openid/urinorm.py @@ -122,10 +122,10 @@ def urinorm(uri): # This is hackish. `unquote` and `quote` requires `str` in both py27 and py3+. if isinstance(path, str): # Python 3 branch - path = quote(unquote(path)) + path = quote(unquote(path), safe='/' + SUB_DELIMS) else: # Python 2 branch - path = quote(unquote(path.encode('utf-8'))).decode('utf-8') + path = quote(unquote(path.encode('utf-8')), safe='/' + SUB_DELIMS).decode('utf-8') path = remove_dot_segments(path) if not path: