@@ -523,7 +523,8 @@ def unquote(string, encoding='utf-8', errors='replace'):
523523 string += pct_sequence .decode (encoding , errors )
524524 return string
525525
526- def parse_qs (qs , keep_blank_values = False , strict_parsing = False ):
526+ def parse_qs (qs , keep_blank_values = False , strict_parsing = False ,
527+ encoding = 'utf-8' , errors = 'replace' ):
527528 """Parse a query given as a string argument.
528529
529530 Arguments:
@@ -540,16 +541,22 @@ def parse_qs(qs, keep_blank_values=False, strict_parsing=False):
540541 strict_parsing: flag indicating what to do with parsing errors.
541542 If false (the default), errors are silently ignored.
542543 If true, errors raise a ValueError exception.
544+
545+ encoding and errors: specify how to decode percent-encoded sequences
546+ into Unicode characters, as accepted by the bytes.decode() method.
543547 """
544548 dict = {}
545- for name , value in parse_qsl (qs , keep_blank_values , strict_parsing ):
549+ pairs = parse_qsl (qs , keep_blank_values , strict_parsing ,
550+ encoding = encoding , errors = errors )
551+ for name , value in pairs :
546552 if name in dict :
547553 dict [name ].append (value )
548554 else :
549555 dict [name ] = [value ]
550556 return dict
551557
552- def parse_qsl (qs , keep_blank_values = False , strict_parsing = False ):
558+ def parse_qsl (qs , keep_blank_values = False , strict_parsing = False ,
559+ encoding = 'utf-8' , errors = 'replace' ):
553560 """Parse a query given as a string argument.
554561
555562 Arguments:
@@ -566,6 +573,9 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False):
566573 false (the default), errors are silently ignored. If true,
567574 errors raise a ValueError exception.
568575
576+ encoding and errors: specify how to decode percent-encoded sequences
577+ into Unicode characters, as accepted by the bytes.decode() method.
578+
569579 Returns a list, as G-d intended.
570580 """
571581 qs , _coerce_result = _coerce_args (qs )
@@ -584,8 +594,12 @@ def parse_qsl(qs, keep_blank_values=False, strict_parsing=False):
584594 else :
585595 continue
586596 if len (nv [1 ]) or keep_blank_values :
587- name = _coerce_result (unquote (nv [0 ].replace ('+' , ' ' )))
588- value = _coerce_result (unquote (nv [1 ].replace ('+' , ' ' )))
597+ name = nv [0 ].replace ('+' , ' ' )
598+ name = unquote (name , encoding = encoding , errors = errors )
599+ name = _coerce_result (name )
600+ value = nv [1 ].replace ('+' , ' ' )
601+ value = unquote (value , encoding = encoding , errors = errors )
602+ value = _coerce_result (value )
589603 r .append ((name , value ))
590604 return r
591605
0 commit comments