v1.0.124: fix ZIP multipart — email.parser instead of buggy cgi.FieldStorage

This commit is contained in:
2026-06-23 08:25:30 +04:00
parent bb2811abb0
commit 402c346021
2 changed files with 16 additions and 22 deletions
+15 -21
View File
@@ -279,36 +279,30 @@ class Handler(BaseHTTPRequestHandler):
def _handle_unzip_upload(self):
"""Распаковать ZIP и загрузить каждый файл в Lucee. Только файлы из корня архива."""
import zipfile, io, cgi, tempfile
import zipfile, io
from email.parser import BytesParser
# CORS preflight уже обработан nginx, но на всякий случай
self._send_cors()
# Парсим multipart через cgi.FieldStorage
content_type = self.headers.get("Content-Type", "")
length = int(self.headers.get("Content-Length", 0))
body = self.rfile.read(length)
# Сохраняем тело во временный файл для cgi.FieldStorage
fp = tempfile.TemporaryFile()
fp.write(body)
fp.seek(0)
# Парсим multipart через email.parser
msg = BytesParser().parsebytes(
b"Content-Type: " + content_type.encode() + b"\r\n\r\n" + body
)
zip_data = None
if msg.is_multipart():
for part in msg.get_payload():
if part.get_filename():
zip_data = part.get_payload(decode=True)
break
else:
zip_data = body
env = os.environ.copy()
env["REQUEST_METHOD"] = "POST"
env["CONTENT_TYPE"] = content_type
env["CONTENT_LENGTH"] = str(length)
form = cgi.FieldStorage(fp=fp, environ=env, keep_blank_values=True)
file_item = form.getfirst("file") or form.getfirst("files")
if not file_item or not file_item.file:
if not zip_data:
self._send_error_cors(400, "no file in request")
fp.close()
return
zip_data = file_item.file.read()
fp.close()
results = []
try:
with zipfile.ZipFile(io.BytesIO(zip_data)) as zf: