From 5813b873a885094759178583f65cc0f0f2bc576b Mon Sep 17 00:00:00 2001 From: Marcel Hellkamp Date: Tue, 11 Dec 2018 13:01:30 +0100 Subject: 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. --- bottle.py | 3 +++ test/test_environ.py | 9 ++++++--- 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): -- cgit v1.2.1