diff options
author | Marcel Hellkamp <marc@gsites.de> | 2018-12-11 13:01:30 +0100 |
---|---|---|
committer | Marcel Hellkamp <marc@gsites.de> | 2023-02-21 12:37:54 +0100 |
commit | bd87c250eaaface6019e6b40d2f70b7d917a6571 (patch) | |
tree | 505555016b59dc1125a4e48d6c898a7e196176d1 | |
parent | 36ef904576ca240efa2c49a77a008a8be70087c2 (diff) | |
download | bottle-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.py | 3 | ||||
-rwxr-xr-x | test/test_environ.py | 9 |
2 files changed, 9 insertions, 3 deletions
@@ -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): |