|
32 | 32 | (b"&a=b", [(b'a', b'b')]),
|
33 | 33 | (b"a=a+b&b=b+c", [(b'a', b'a b'), (b'b', b'b c')]),
|
34 | 34 | (b"a=1&a=2", [(b'a', b'1'), (b'a', b'2')]),
|
35 |
| - (";", []), |
36 |
| - (";;", []), |
37 |
| - (";a=b", [('a', 'b')]), |
38 |
| - ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), |
39 |
| - ("a=1;a=2", [('a', '1'), ('a', '2')]), |
40 |
| - (b";", []), |
41 |
| - (b";;", []), |
42 |
| - (b";a=b", [(b'a', b'b')]), |
43 |
| - (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), |
44 |
| - (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), |
45 | 35 | ]
|
46 | 36 |
|
47 | 37 | # Each parse_qs testcase is a two-tuple that contains
|
|
68 | 58 | (b"&a=b", {b'a': [b'b']}),
|
69 | 59 | (b"a=a+b&b=b+c", {b'a': [b'a b'], b'b': [b'b c']}),
|
70 | 60 | (b"a=1&a=2", {b'a': [b'1', b'2']}),
|
71 |
| - (";", {}), |
72 |
| - (";;", {}), |
73 |
| - (";a=b", {'a': ['b']}), |
74 |
| - ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), |
75 |
| - ("a=1;a=2", {'a': ['1', '2']}), |
76 |
| - (b";", {}), |
77 |
| - (b";;", {}), |
78 |
| - (b";a=b", {b'a': [b'b']}), |
79 |
| - (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), |
80 |
| - (b"a=1;a=2", {b'a': [b'1', b'2']}), |
81 | 61 | ]
|
82 | 62 |
|
83 | 63 | class UrlParseTestCase(unittest.TestCase):
|
@@ -886,10 +866,43 @@ def test_parse_qsl_encoding(self):
|
886 | 866 | def test_parse_qsl_max_num_fields(self):
|
887 | 867 | with self.assertRaises(ValueError):
|
888 | 868 | urllib.parse.parse_qs('&'.join(['a=a']*11), max_num_fields=10)
|
889 |
| - with self.assertRaises(ValueError): |
890 |
| - urllib.parse.parse_qs(';'.join(['a=a']*11), max_num_fields=10) |
891 | 869 | urllib.parse.parse_qs('&'.join(['a=a']*10), max_num_fields=10)
|
892 | 870 |
|
| 871 | + def test_parse_qs_separator(self): |
| 872 | + semicolon_cases = [ |
| 873 | + (";", {}), |
| 874 | + (";;", {}), |
| 875 | + (";a=b", {'a': ['b']}), |
| 876 | + ("a=a+b;b=b+c", {'a': ['a b'], 'b': ['b c']}), |
| 877 | + ("a=1;a=2", {'a': ['1', '2']}), |
| 878 | + (b";", {}), |
| 879 | + (b";;", {}), |
| 880 | + (b";a=b", {b'a': [b'b']}), |
| 881 | + (b"a=a+b;b=b+c", {b'a': [b'a b'], b'b': [b'b c']}), |
| 882 | + (b"a=1;a=2", {b'a': [b'1', b'2']}), |
| 883 | + ] |
| 884 | + for orig, expect in semicolon_cases: |
| 885 | + result = urllib.parse.parse_qs(orig, separator=';') |
| 886 | + self.assertEqual(result, expect, "Error parsing %r" % orig) |
| 887 | + |
| 888 | + |
| 889 | + def test_parse_qsl_separator(self): |
| 890 | + semicolon_cases = [ |
| 891 | + (";", []), |
| 892 | + (";;", []), |
| 893 | + (";a=b", [('a', 'b')]), |
| 894 | + ("a=a+b;b=b+c", [('a', 'a b'), ('b', 'b c')]), |
| 895 | + ("a=1;a=2", [('a', '1'), ('a', '2')]), |
| 896 | + (b";", []), |
| 897 | + (b";;", []), |
| 898 | + (b";a=b", [(b'a', b'b')]), |
| 899 | + (b"a=a+b;b=b+c", [(b'a', b'a b'), (b'b', b'b c')]), |
| 900 | + (b"a=1;a=2", [(b'a', b'1'), (b'a', b'2')]), |
| 901 | + ] |
| 902 | + for orig, expect in semicolon_cases: |
| 903 | + result = urllib.parse.parse_qsl(orig, separator=';') |
| 904 | + self.assertEqual(result, expect, "Error parsing %r" % orig) |
| 905 | + |
893 | 906 | def test_urlencode_sequences(self):
|
894 | 907 | # Other tests incidentally urlencode things; test non-covered cases:
|
895 | 908 | # Sequence and object values.
|
|
0 commit comments