drhider: тест-режим 'только загрузка' (?upload-only=1) — ранний выход до Фазы 2 (без обработки) + debug-endpoint /api/session_files

This commit is contained in:
“Naeel”
2026-08-23 07:05:52 +03:00
parent 2a735e34f8
commit 82b597e1c2
2 changed files with 24 additions and 0 deletions
+12
View File
@@ -108,6 +108,18 @@ def upload_refs():
return jsonify({"ok": True, "session": sid, "count": file_count(sid)})
@api_bp.route("/session_files/<sid>", methods=["GET"])
def session_files(sid):
"""Отладка: список файлов сессии с размерами (для теста загрузки)."""
files = get_files(sid)
if files is None:
return jsonify({"ok": False, "error": "Session not found"}), 404
return jsonify({
"ok": True, "count": len(files),
"files": [{"name": n, "size": len(b)} for n, b in files],
})
@api_bp.route("/process_stream/<sid>", methods=["GET"])
def process_stream(sid):
"""SSE: process all session files, streaming per-file progress.
+12
View File
@@ -199,6 +199,8 @@ let overNames = new Set(); // имена файлов сверх лимита (
const MAX_FILE_BYTES = 100 * 1024 * 1024; // 100 МБ на файл
const MAX_SESSION_BYTES = 1024 * 1024 * 1024; // 1 ГБ суммарно
const VM_UPLOAD_URL = 'https://contracts.kube5s.ru/drhider-upload/'; // ВМ-буфер: PUT больших файлов (шлюз кластера их рвёт)
// Тест-режим: открыть страницу с ?upload-only=1 → только загрузка, без обработки
const TEST_UPLOAD_ONLY = new URLSearchParams(location.search).get('upload-only') === '1';
let currentSid = '';
let activeES = null; // активный EventSource
let activeXHR = null; // активный XHR
@@ -438,6 +440,7 @@ async function uploadFiles() {
// Фаза 1: загрузка на ВМ-буфер (PUT напрямую на nginx ВМ, минуя шлюз кластера)
const token = crypto.randomUUID();
const refs = []; // {name, size, url} — для POST /api/upload_refs
let uploadedCount = 0; // сколько файлов реально легло в сессию (для тест-режима)
for (let k = 0; k < total; k++) {
const f = toSend[k];
const i = sendIdx[k]; // индекс в sf для вывода прогресса
@@ -494,6 +497,7 @@ async function uploadFiles() {
const data = await resp.json();
if (!data.ok) throw new Error(data.error || 'HTTP ' + resp.status);
currentSid = data.session;
uploadedCount = data.count || refs.length;
} catch (err) {
st.className = 'status error';
st.textContent = 'Ошибка передачи ссылок: ' + err.message;
@@ -501,6 +505,14 @@ async function uploadFiles() {
return;
}
// Тест-режим (?upload-only=1): только загрузка, без обработки
if (TEST_UPLOAD_ONLY) {
st.className = 'status done';
st.textContent = '✅ Загружено ' + uploadedCount + ' файлов (тест: обработка пропущена). Сессия: ' + currentSid;
ub.disabled = false;
return;
}
// Фаза 2: обработка (SSE — прогресс по каждому файлу)
// Сброс загрузочных статусов — теперь этап обработки (только отправленные)
for (let k = 0; k < total; k++) ss(sendIdx[k], '<span style="color:#2563eb">⏳</span>');