--- C:\DOCUME~1\PROPRI~1\LOCALS~1\Temp\test_cgi.py-revBASE.svn002.tmp.py ven. janv. 28 21:53:05 2011 +++ C:\python-dev\test\test_cgi.py ven. janv. 28 21:52:56 2011 @@ -1,3 +1,5 @@ +# -*- coding: iso-8859-1 -*- + from test.support import run_unittest, check_warnings import cgi import os @@ -105,10 +107,9 @@ return [(p[0], p[1][0]) for p in list] def gen_result(data, environ): - encoding = 'latin-1' - fake_stdin = BytesIO(data.encode(encoding)) + fake_stdin = BytesIO(data.encode('latin-1')) fake_stdin.seek(0) - form = cgi.FieldStorage(fp=fake_stdin, environ=environ, encoding=encoding) + form = cgi.FieldStorage(fp=fake_stdin, environ=environ,encoding='latin-1') result = {} for k, v in dict(form).items(): @@ -192,34 +193,12 @@ # (by read_binary); if we are chunking properly, it will be called 5 times # as long as the chunksize is 1 << 16. self.assertTrue(f.numcalls > 2) - f.close() def test_fieldstorage_multipart(self): #Test basic FieldStorage multipart parsing env = {'REQUEST_METHOD':'POST', 'CONTENT_TYPE':'multipart/form-data; boundary=---------------------------721837373350705526688164684', 'CONTENT_LENGTH':'558'} - postdata = """-----------------------------721837373350705526688164684 -Content-Disposition: form-data; name="id" - -1234 ------------------------------721837373350705526688164684 -Content-Disposition: form-data; name="title" - - ------------------------------721837373350705526688164684 -Content-Disposition: form-data; name="file"; filename="test.txt" -Content-Type: text/plain - -Testing 123. - ------------------------------721837373350705526688164684 -Content-Disposition: form-data; name="submit" - - Add\x20 ------------------------------721837373350705526688164684-- -""" - encoding = 'ascii' - fp = BytesIO(postdata.encode(encoding)) - fs = cgi.FieldStorage(fp, environ=env, encoding=encoding) + fp = BytesIO(postdata.encode('latin-1')) + fs = cgi.FieldStorage(fp, environ=env, encoding="latin-1") self.assertEqual(len(fs.list), 4) expect = [{'name':'id', 'filename':None, 'value':'1234'}, {'name':'title', 'filename':None, 'value':''}, @@ -230,6 +209,22 @@ got = getattr(fs.list[x], k) self.assertEqual(got, exp) + def test_fieldstorage_multipart_non_ascii(self): + #Test basic FieldStorage multipart parsing + env = {'REQUEST_METHOD':'POST', + 'CONTENT_TYPE': 'multipart/form-data; \ + boundary=---------------------------721837373350705526688164684', + 'CONTENT_LENGTH':'558'} + for encoding in ['iso-8859-1','utf-8']: + fp = BytesIO(postdata_non_ascii.encode(encoding)) + fs = cgi.FieldStorage(fp, environ=env,encoding=encoding) + self.assertEqual(len(fs.list), 1) + expect = [{'name':'id', 'filename':None, 'value':'ηρ€'}] + for x in range(len(fs.list)): + for k, exp in expect[x].items(): + got = getattr(fs.list[x], k) + self.assertEqual(got, exp) + _qs_result = { 'key1': 'value1', 'key2': ['value2x', 'value2y'], @@ -300,7 +295,7 @@ } result = self._qs_result.copy() result.update({ - 'upload': b'this is the content of the fake file\n' + 'upload': b'this is the content of the fake file\n' # bytes }) v = gen_result(data, environ) self.assertEqual(result, v) @@ -346,6 +341,35 @@ ("attachment", {"filename": "strange;name", "size": "123"})) +postdata = """-----------------------------721837373350705526688164684 +Content-Disposition: form-data; name="id" + +1234 +-----------------------------721837373350705526688164684 +Content-Disposition: form-data; name="title" + + +-----------------------------721837373350705526688164684 +Content-Disposition: form-data; name="file"; filename="test.txt" +Content-Type: text/plain + +Testing 123. + +-----------------------------721837373350705526688164684 +Content-Disposition: form-data; name="submit" + + Add\x20 +-----------------------------721837373350705526688164684-- +""" + +postdata_non_ascii = """-----------------------------721837373350705526688164684 +Content-Disposition: form-data; name="id" + +ηρ€ +-----------------------------721837373350705526688164684 +""" + + def test_main(): run_unittest(CgiTests)