diff --git a/rfc3986/normalizers.py b/rfc3986/normalizers.py index bb0630c..9e0812e 100644 --- a/rfc3986/normalizers.py +++ b/rfc3986/normalizers.py @@ -43,10 +43,14 @@ def normalize_path(path): def normalize_query(query): + if not query: + return query return normalize_percent_characters(query) def normalize_fragment(fragment): + if not fragment: + return fragment return normalize_percent_characters(fragment) diff --git a/rfc3986/parseresult.py b/rfc3986/parseresult.py index 2def55b..44c5df7 100644 --- a/rfc3986/parseresult.py +++ b/rfc3986/parseresult.py @@ -76,8 +76,8 @@ class ParseResult(namedtuple('ParseResult', PARSED_COMPONENTS), host, port or None, path or None, - query or None, - fragment or None) + query, + fragment) parse_result.encoding = encoding parse_result.reference = uri_ref return parse_result diff --git a/rfc3986/uri.py b/rfc3986/uri.py index b7f5ccb..8fad698 100644 --- a/rfc3986/uri.py +++ b/rfc3986/uri.py @@ -38,8 +38,8 @@ class URIReference(namedtuple('URIReference', URI_COMPONENTS)): scheme or None, authority or None, path or None, - query or None, - fragment or None) + query, + fragment) ref.encoding = encoding return ref @@ -264,8 +264,8 @@ class URIReference(namedtuple('URIReference', URI_COMPONENTS)): normalize_authority( (self.userinfo, self.host, self.port)), normalize_path(self.path or ''), - normalize_query(self.query or ''), - normalize_fragment(self.fragment or '')) + normalize_query(self.query), + normalize_fragment(self.fragment)) def normalized_equality(self, other_ref): """Compare this URIReference to another URIReference. @@ -358,9 +358,9 @@ class URIReference(namedtuple('URIReference', URI_COMPONENTS)): result_list.extend(['//', self.authority]) if self.path: result_list.append(self.path) - if self.query: + if self.query is not None: result_list.extend(['?', self.query]) - if self.fragment: + if self.fragment is not None: result_list.extend(['#', self.fragment]) return ''.join(result_list) diff --git a/tests/test_normalizers.py b/tests/test_normalizers.py index ddcb97b..77ab1b0 100644 --- a/tests/test_normalizers.py +++ b/tests/test_normalizers.py @@ -70,3 +70,9 @@ def test_authority_normalization(): uri = URIReference( None, 'user%2aName@EXAMPLE.COM', None, None, None).normalize() assert uri.authority == 'user%2AName@example.com' + + +def test_fragment_normalization(): + uri = URIReference( + None, 'example.com', None, None, 'fiz%DF').normalize() + assert uri.fragment == 'fiz%DF' diff --git a/tests/test_uri.py b/tests/test_uri.py index 6cd7da3..eb2dd0d 100644 --- a/tests/test_uri.py +++ b/tests/test_uri.py @@ -337,3 +337,10 @@ class TestURIReferencesResolve: T = R.resolve_with(B) assert T.path is None assert T.query == 'query' + + +def test_empty_querystrings_persist(): + url = 'https://httpbin.org/get?' + ref = URIReference.from_string(url) + assert ref.query == '' + assert ref.unsplit() == url