]> granicus.if.org Git - python/commitdiff
fix bug #110661 (PR#356) -- accept either & or ; as separator for CGI
authorJeremy Hylton <jeremy@alum.mit.edu>
Fri, 15 Sep 2000 20:06:57 +0000 (20:06 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Fri, 15 Sep 2000 20:06:57 +0000 (20:06 +0000)
    query string
also some doc string reformatting and use of string methods instead of
    older string.splitfields

Lib/cgi.py
Lib/test/output/test_cgi
Lib/test/test_cgi.py

index 2a214050c703d476e0c72eefeb4c4fb386e4ca31..fa759298fb2bb90d164dba3eb5278b361d64133a 100755 (executable)
@@ -176,27 +176,26 @@ def parse_qs(qs, keep_blank_values=0, strict_parsing=0):
 def parse_qsl(qs, keep_blank_values=0, strict_parsing=0):
     """Parse a query given as a string argument.
 
-        Arguments:
+    Arguments:
 
-        qs: URL-encoded query string to be parsed
+    qs: URL-encoded query string to be parsed
 
-        keep_blank_values: flag indicating whether blank values in
-            URL encoded queries should be treated as blank strings.  
-            A true value indicates that blanks should be retained as 
-            blank strings.  The default false value indicates that
-            blank values are to be ignored and treated as if they were
-            not included.
+    keep_blank_values: flag indicating whether blank values in
+        URL encoded queries should be treated as blank strings.  A
+        true value indicates that blanks should be retained as blank
+        strings.  The default false value indicates that blank values
+        are to be ignored and treated as if they were  not included.
 
-        strict_parsing: flag indicating what to do with parsing errors.
-            If false (the default), errors are silently ignored.
-            If true, errors raise a ValueError exception.
+    strict_parsing: flag indicating what to do with parsing errors. If
+        false (the default), errors are silently ignored. If true,
+        errors raise a ValueError exception. 
 
-       Returns a list, as God intended.
+    Returns a list, as G-d intended.
     """
-    name_value_pairs = string.splitfields(qs, '&')
-    r=[]
-    for name_value in name_value_pairs:
-        nv = string.splitfields(name_value, '=', 1)
+    pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
+    r = []
+    for name_value in pairs:
+        nv = name_value.split('=', 1)
         if len(nv) != 2:
             if strict_parsing:
                 raise ValueError, "bad query field: %s" % `name_value`
index e9476d77e6dd9b4527d10c7e3b0dadb1e146d56f..3741c22d01544f09003001a6adb0b565829984e8 100644 (file)
@@ -2,8 +2,11 @@ test_cgi
 ''
 '&'
 '&&'
+';'
+';&;'
 '='
 '=&='
+'=;='
 '=a'
 '&=a'
 '=a&'
@@ -17,6 +20,8 @@ test_cgi
 'a=a+b&b=b+c'
 'a=a+b&a=b+a'
 'x=1&y=2.0&z=2-3.%2b0'
+'x=1;y=2.0&z=2-3.%2b0'
+'x=1;y=2.0;z=2-3.%2b0'
 'Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env'
 'group_id=5470&set=custom&_assigned_to=31392&_status=1&_category=100&SUBMIT=Browse'
 Testing log
index 29eb5a6c1850cd295524043f061c7501c9d5aa4f..de601158aecaa208be859f5a7032d6e6a2c0b1cf 100644 (file)
@@ -58,9 +58,12 @@ parse_test_cases = [
     ("", ValueError("bad query field: ''")),
     ("&", ValueError("bad query field: ''")),
     ("&&", ValueError("bad query field: ''")),
+    (";", ValueError("bad query field: ''")),
+    (";&;", ValueError("bad query field: ''")),
     # Should the next few really be valid?
     ("=", {}),
     ("=&=", {}),
+    ("=;=", {}),
     # This rest seem to make sense
     ("=a", {'': ['a']}),
     ("&=a", ValueError("bad query field: ''")),
@@ -75,6 +78,8 @@ parse_test_cases = [
     ("a=a+b&b=b+c", {'a': ['a b'], 'b': ['b c']}),
     ("a=a+b&a=b+a", {'a': ['a b', 'b a']}),
     ("x=1&y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}),
+    ("x=1;y=2.0&z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}),
+    ("x=1;y=2.0;z=2-3.%2b0", {'x': ['1'], 'y': ['2.0'], 'z': ['2-3.+0']}),
     ("Hbc5161168c542333633315dee1182227:key_store_seqid=400006&cuyer=r&view=bustomer&order_id=0bb2e248638833d48cb7fed300000f1b&expire=964546263&lobale=en-US&kid=130003.300038&ss=env",
      {'Hbc5161168c542333633315dee1182227:key_store_seqid': ['400006'],
       'cuyer': ['r'],