From: Martin von Gagern Date: Wed, 7 Aug 2013 04:20:26 +0000 (+0200) Subject: Accept header parameters in RFC 2231 format. X-Git-Tag: v5.1.0b1~5^2~1^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e04f1ad1b5f5454e5f0909c7acb73e3872dca0c6;p=thirdparty%2Ftornado.git Accept header parameters in RFC 2231 format. This should fix facebook/tornado#868. --- diff --git a/tornado/httputil.py b/tornado/httputil.py index 3e7337d99..df057d965 100644 --- a/tornado/httputil.py +++ b/tornado/httputil.py @@ -420,23 +420,37 @@ def _parseparam(s): def _parse_header(line): - """Parse a Content-type like header. + r"""Parse a Content-type like header. Return the main content-type and a dictionary of options. + >>> d = _parse_header("CD: fd; foo=\"bar\"; file*=utf-8''T%C3%A4st")[1] + >>> d['file'] == 'T\u00e4st' + True + >>> d['foo'] + 'bar' """ parts = _parseparam(';' + line) key = next(parts) - pdict = {} + # decode_params treats first argument special, but we already stripped key + params = [('Dummy', 'value')] for p in parts: i = p.find('=') if i >= 0: name = p[:i].strip().lower() value = p[i + 1:].strip() - if len(value) >= 2 and value[0] == value[-1] == '"': + if len(value) >= 2 and value[0] == value[-1] == '"' and False: value = value[1:-1] value = value.replace('\\\\', '\\').replace('\\"', '"') - pdict[name] = value + params.append((name, value)) + params = email.utils.decode_params(params) + params.pop(0) # get rid of the dummy again + pdict = {} + for name, value in params: + value = email.utils.collapse_rfc2231_value(value) + if len(value) >= 2 and value[0] == '"' and value[-1] == '"': + value = value[1:-1] + pdict[name] = value return key, pdict