File tree Expand file tree Collapse file tree 2 files changed +15
-0
lines changed
Expand file tree Collapse file tree 2 files changed +15
-0
lines changed Original file line number Diff line number Diff line change @@ -1227,6 +1227,13 @@ def test_parse_qs_encoding(self):
12271227 errors = "ignore" )
12281228 self .assertEqual (result , {'key' : ['\u0141 -' ]})
12291229
1230+ def test_qsl_strict_parsing_raises (self ):
1231+ with self .assertRaises (ValueError ):
1232+ urllib .parse .parse_qsl ("foo" , strict_parsing = True )
1233+
1234+ with self .assertRaises (ValueError ):
1235+ urllib .parse .parse_qsl (b"foo" , strict_parsing = True )
1236+
12301237 def test_parse_qsl_encoding (self ):
12311238 result = urllib .parse .parse_qsl ("key=\u0141 %E9" , encoding = "latin-1" )
12321239 self .assertEqual (result , [('key' , '\u0141 \xE9 ' )])
Original file line number Diff line number Diff line change 9191# Unsafe bytes to be removed per WHATWG spec
9292_UNSAFE_URL_BYTES_TO_REMOVE = ['\t ' , '\r ' , '\n ' ]
9393
94+ # Allowed valid characters in parse_qsl
95+ _VALID_QUERY_CHARS = re .compile (r"^[A-Za-z0-9\-._~!$&'()*+,;=:@/?%]*$" )
96+
9497def clear_cache ():
9598 """Clear internal performance caches. Undocumented; some tests want it."""
9699 urlsplit .cache_clear ()
@@ -854,6 +857,11 @@ def _unquote(s):
854857 name , has_eq , value = name_value .partition (eq )
855858 if not has_eq and strict_parsing :
856859 raise ValueError ("bad query field: %r" % (name_value ,))
860+ if strict_parsing :
861+ # Validate RFC3986 characters
862+ to_check = (name_value .decode () if isinstance (name_value , bytes ) else name_value )
863+ if not _VALID_QUERY_CHARS .match (to_check ):
864+ raise ValueError (f"Invalid characters in query string per RFC 3986: { name_value !r} " )
857865 if value or keep_blank_values :
858866 name = _unquote (name )
859867 value = _unquote (value )
You can’t perform that action at this time.
0 commit comments