summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2018-12-11 13:01:30 +0100
committerMarcel Hellkamp <marc@gsites.de>2023-02-21 12:37:54 +0100
commitbd87c250eaaface6019e6b40d2f70b7d917a6571 (patch)
tree505555016b59dc1125a4e48d6c898a7e196176d1
parent36ef904576ca240efa2c49a77a008a8be70087c2 (diff)
downloadbottle-bd87c250eaaface6019e6b40d2f70b7d917a6571.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.
-rw-r--r--bottle.py3
-rwxr-xr-xtest/test_environ.py9
2 files changed, 9 insertions, 3 deletions
diff --git a/bottle.py b/bottle.py
index c317bf3..0205ca8 100644
--- a/bottle.py
+++ b/bottle.py
@@ -1095,6 +1095,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
@@ -1118,6 +1119,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
@@ -1243,6 +1245,7 @@ class BaseRequest(object):
newline='\n')
elif py3k:
args['encoding'] = 'utf8'
+ post.recode_unicode = False
data = cgi.FieldStorage(**args)
self['_cgi.FieldStorage'] = data #http://bugs.python.org/issue18394#msg207958
data = data.list or []
diff --git a/test/test_environ.py b/test/test_environ.py
index de50c0b..8e96fc9 100755
--- a/test/test_environ.py
+++ b/test/test_environ.py
@@ -328,7 +328,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)
@@ -358,10 +358,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):