summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2018-12-11 13:01:30 +0100
committerMarcel Hellkamp <marc@gsites.de>2018-12-11 13:01:30 +0100
commit5813b873a885094759178583f65cc0f0f2bc576b (patch)
tree9544b90bcfa3d88f93ed52e836d7095e14756cd0
parent9fb3b05846b33e508545a26e424785e151d02323 (diff)
downloadbottle-5813b873a885094759178583f65cc0f0f2bc576b.tar.gz
fix #1111: Unicode multipart/form-data values in python3
Multipart form uploads are not affected by the WSGI/PEP-3333 'latin1' default encoding quirk and already properly decoded as utf8, so we have to disable FormsDict.recode_unicode for these.
-rwxr-xr-xbottle.py3
-rwxr-xr-xtest/test_environ.py9
2 files changed, 9 insertions, 3 deletions
diff --git a/bottle.py b/bottle.py
index 1380292..d233753 100755
--- a/bottle.py
+++ b/bottle.py
@@ -1248,6 +1248,7 @@ class BaseRequest(object):
:class:`FormsDict`. All keys and values are strings. File uploads
are stored separately in :attr:`files`. """
forms = FormsDict()
+ forms.recode_unicode = self.POST.recode_unicode
for name, item in self.POST.allitems():
if not isinstance(item, FileUpload):
forms[name] = item
@@ -1271,6 +1272,7 @@ class BaseRequest(object):
"""
files = FormsDict()
+ files.recode_unicode = self.POST.recode_unicode
for name, item in self.POST.allitems():
if isinstance(item, FileUpload):
files[name] = item
@@ -1405,6 +1407,7 @@ class BaseRequest(object):
if py3k:
args['encoding'] = 'utf8'
+ post.recode_unicode = False
data = cgi.FieldStorage(**args)
self['_cgi.FieldStorage'] = data #http://bugs.python.org/issue18394
data = data.list or []
diff --git a/test/test_environ.py b/test/test_environ.py
index bd6d3b1..f0b8874 100755
--- a/test/test_environ.py
+++ b/test/test_environ.py
@@ -319,7 +319,7 @@ class TestRequest(unittest.TestCase):
def test_multipart(self):
""" Environ: POST (multipart files and multible values per key) """
- fields = [('field1','value1'), ('field2','value2'), ('field2','value3')]
+ fields = [('field1','value1'), ('field2','value2'), ('field2','万难')]
files = [('file1','filename1.txt','content1'), ('万难','万难foo.py', 'ä\nö\rü')]
e = tools.multipart_environ(fields=fields, files=files)
request = BaseRequest(e)
@@ -349,10 +349,13 @@ class TestRequest(unittest.TestCase):
self.assertEqual('value1', request.POST['field1'])
self.assertTrue('field1' not in request.files)
self.assertEqual('value1', request.forms['field1'])
+ print(request.forms.dict, request.forms.recode_unicode)
+ self.assertEqual('万难', request.forms['field2'])
+ self.assertEqual(touni('万难'), request.forms.field2)
# Field (multi)
self.assertEqual(2, len(request.POST.getall('field2')))
- self.assertEqual(['value2', 'value3'], request.POST.getall('field2'))
- self.assertEqual(['value2', 'value3'], request.forms.getall('field2'))
+ self.assertEqual(['value2', '万难'], request.POST.getall('field2'))
+ self.assertEqual(['value2', '万难'], request.forms.getall('field2'))
self.assertTrue('field2' not in request.files)
def test_json_empty(self):