Загрузка файлов с компьютера снова работает: форма собиралась уже после блокировки поля файла, и браузер отправлял пустой запрос (ошибка 422)

Этот коммит содержится в:
2026-09-27 16:20:58 +09:00
родитель b7c87867fb
Коммит af9cae85de
2 изменённых файлов: 13 добавлений и 1 удалений
+10
Просмотреть файл
@@ -1,3 +1,4 @@
from pathlib import Path
from urllib.parse import unquote from urllib.parse import unquote
import pytest import pytest
@@ -186,3 +187,12 @@ def test_live_status(logged_in):
data = logged_in.get("/live/status").json() data = logged_in.get("/live/status").json()
assert data["ok"] is True assert data["ok"] is True
assert {vm["name"] for vm in data["vms"]} == {"web01", "db01"} assert {vm["name"] for vm in data["vms"]} == {"web01", "db01"}
def test_uploader_collects_file_before_disabling_input():
"""Заблокированное поле браузер не отправляет: загрузка уходила пустой (44 байта) и получала 422."""
script = (Path(__file__).resolve().parents[1] / "web" / "static" / "panel.js").read_text()
uploader = script[script.index("function wireUploader"):script.index("/* ---------------------------------------------------- operation page */")]
assert "input.disabled = active" in uploader
assert uploader.index("new FormData(form)") < uploader.index("setActive(true)")
assert "xhr.send(data)" in uploader
+3 -1
Просмотреть файл
@@ -300,6 +300,8 @@
const file = input.files[0]; const file = input.files[0];
if (!valid(file)) { setError('Выберите файл'); return; } if (!valid(file)) { setError('Выберите файл'); return; }
const started = Date.now(); const started = Date.now();
// FormData собираем до setActive: заблокированное поле файла браузер в отправку не включает.
const data = new FormData(form);
xhr = new XMLHttpRequest(); xhr = new XMLHttpRequest();
setActive(true); progress.hidden = false; progress.classList.remove('success', 'danger'); setActive(true); progress.hidden = false; progress.classList.remove('success', 'danger');
statusEl.textContent = 'Загрузка на сервер…'; statusEl.textContent = 'Загрузка на сервер…';
@@ -337,7 +339,7 @@
xhr.open('POST', form.action); xhr.open('POST', form.action);
xhr.setRequestHeader('Accept', 'application/json'); xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send(new FormData(form)); xhr.send(data);
}); });
showFile(); showFile();
} }