--- test_cgi.py.v2.7.5 2015-02-11 10:39:36.715759877 +0200 +++ test_cgi.py 2015-02-11 10:50:27.251832656 +0200 @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- from test.test_support import run_unittest, check_warnings import cgi import os @@ -386,6 +387,31 @@ cgi.parse_header('form-data; name="files"; filename="fo\\"o;bar"'), ("form-data", {"name": "files", "filename": 'fo"o;bar'})) + def test_multipart_rfc6266_filename(self): + #Test parsing the RFC6266-compatible Content-Disposition headers + postdata = """-----------------------------9fd4bdc22d86451d99cdeae51744bbcb +Content-Disposition: form-data; name="non_latin_filename"; filename*=utf-8''%D1%96%D0%BC%27%D1%8F%20%D1%84%D0%B0%D0%B9%D0%BB%D1%83.txt +Content-type: text/plain + +testvalue +-----------------------------9fd4bdc22d86451d99cdeae51744bbcb-- +""" + boundary = postdata.split('\n', 1)[0] + env = { + 'REQUEST_METHOD':'POST', + 'CONTENT_TYPE':'multipart/form-data; boundary={}'.format(postdata.split('\n', 1)[0][2:]), + 'CONTENT_LENGTH':str(len(postdata)), + } + + fs = cgi.FieldStorage(fp=StringIO(postdata), environ=env) + self.assertEqual(len(fs.list), 1) + expect = [{'name':'non_latin_filename', 'filename': u"ім'я файлу.txt", 'value':'testvalue'}, + ] + for x in range(len(fs.list)): + for k, exp in expect[x].items(): + got = getattr(fs.list[x], k) + self.assertEqual(got, exp) + def test_main(): run_unittest(CgiTests)