summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Philippsen <nils@redhat.com>2015-08-19 16:23:10 +0200
committerNils Philippsen <nils@redhat.com>2015-08-19 16:23:10 +0200
commita5ee861c01ec94096dea918d551be596f844291e (patch)
tree2bee7bc9c75409feaa2c84db2ca13213d7902fd7
parent0a70450e3f57e6478b9244f42aeebea744fec77c (diff)
downloadpaste-a5ee861c01ec94096dea918d551be596f844291e.tar.gz
Python 3: Don't mangle strangely encoded input
In Python 3, cgi.FieldStorage needs to know about encodings like shiftjis in order to decode it properly (in Python 2 it's simply not decoded at all). Fixes tests.test_wsgiwrappers.test_wsgirequest_charset
-rw-r--r--paste/request.py11
-rw-r--r--paste/wsgiwrappers.py3
2 files changed, 11 insertions, 3 deletions
diff --git a/paste/request.py b/paste/request.py
index f0d91c1..8d5e5c3 100644
--- a/paste/request.py
+++ b/paste/request.py
@@ -140,7 +140,7 @@ def parse_dict_querystring(environ):
environ['paste.parsed_dict_querystring'] = (multi, source)
return multi
-def parse_formvars(environ, include_get_vars=True):
+def parse_formvars(environ, include_get_vars=True, encoding=None, errors=None):
"""Parses the request, returning a MultiDict of form variables.
If ``include_get_vars`` is true then GET (query string) variables
@@ -182,9 +182,16 @@ def parse_formvars(environ, include_get_vars=True):
environ['CONTENT_TYPE'] = ''
else:
input = environ['wsgi.input']
+ kwparms = {}
+ if six.PY3:
+ if encoding:
+ kwparms['encoding'] = encoding
+ if errors:
+ kwparms['errors'] = errors
fs = cgi.FieldStorage(fp=input,
environ=environ,
- keep_blank_values=1)
+ keep_blank_values=1,
+ **kwparms)
environ['QUERY_STRING'] = old_query_string
if fake_out_cgi:
environ['CONTENT_TYPE'] = old_content_type
diff --git a/paste/wsgiwrappers.py b/paste/wsgiwrappers.py
index 7b8f6de..674054f 100644
--- a/paste/wsgiwrappers.py
+++ b/paste/wsgiwrappers.py
@@ -199,7 +199,8 @@ class WSGIRequest(object):
GET = property(GET, doc=GET.__doc__)
def _POST(self):
- return parse_formvars(self.environ, include_get_vars=False)
+ return parse_formvars(self.environ, include_get_vars=False,
+ encoding=self.charset, errors=self.errors)
def POST(self):
"""Dictionary-like object representing the POST body.