Fixes Python CGI being confused about binary files (bugs 31546357 & 31936635). Upstream issue: https://bugs.python.org/issue27777 WIP patch taken from upstream is still buggy, so we use this in-house developed one. --- Python-3.9.0/Lib/cgi.py +++ Python-3.9.0/Lib/cgi.py @@ -689,7 +689,10 @@ if not data: self.done = -1 break - self.file.write(data) + if self._binary_file: + self.file.write(data) + else: + self.file.write(data.decode()) todo = todo - len(data) def read_lines(self): --- Python-3.9.0/Lib/test/test_cgi.py +++ Python-3.9.0/Lib/test/test_cgi.py @@ -366,6 +366,18 @@ Larry self.assertEqual(fs.list[0].name, 'submit-name') self.assertEqual(fs.list[0].value, 'Larry') + def test_content_length_no_content_disposition(self): + body = b'{"test":123}' + env = { + 'CONTENT_LENGTH': len(body), + 'REQUEST_METHOD': 'POST', + 'CONTENT_TYPE': 'application/json', + 'wsgi.input': BytesIO(body), + } + + form = cgi.FieldStorage(fp=env['wsgi.input'], environ=env) + self.assertEqual(form.file.read(), body.decode(form.encoding)) + def test_field_storage_multipart_no_content_length(self): fp = BytesIO(b"""--MyBoundary Content-Disposition: form-data; name="my-arg"; filename="foo"