diff options
author | Marcel Hellkamp <marc@gsites.de> | 2018-12-11 13:01:30 +0100 |
---|---|---|
committer | Marcel Hellkamp <marc@gsites.de> | 2018-12-11 13:01:30 +0100 |
commit | 5813b873a885094759178583f65cc0f0f2bc576b (patch) | |
tree | 9544b90bcfa3d88f93ed52e836d7095e14756cd0 | |
parent | 9fb3b05846b33e508545a26e424785e151d02323 (diff) | |
download | bottle-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-x | bottle.py | 3 | ||||
-rwxr-xr-x | test/test_environ.py | 9 |
2 files changed, 9 insertions, 3 deletions
@@ -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): |