Загрузка файлов с компьютера снова работает: форма собиралась уже после блокировки поля файла, и браузер отправлял пустой запрос (ошибка 422)
Этот коммит содержится в:
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user