fix(download): return 200 for missing queue items and quiet download-progress 404s

The browser extension's apiFetch treats any 404 as a missing endpoint and
retries the legacy non-/api/lm URL, producing two spurious
'error_middleware - WARNING - API GET ... 404' log lines per occurrence.

- complete_download_in_queue / update_download_queue_status /
  retry_download_from_history: 'not found' is a normal business outcome,
  return 200 + success:false instead of 404 (extension behavior unchanged;
  apiGet ignores the HTTP status)
- error_middleware: downgrade /api/lm/download-progress/ 404s to debug like
  previews - the 404 status itself stays (extension uses it for failure
  detection), only the log level is lowered
This commit is contained in:
Will Miao
2026-08-25 09:59:33 +08:00
parent e05046af10
commit a202c666bc
3 changed files with 208 additions and 5 deletions
+10
View File
@@ -46,6 +46,16 @@ async def api_json_error(
if request.path.startswith("/api/lm/previews") and exc.status == 404:
logger_method = logger.debug
# Download-progress 404 is routine too: in-memory tracking is removed
# once a download finishes/fails, so the extension's final polls 404.
# The extension relies on the 404 status itself (failure detection),
# so only the log level is lowered.
if (
request.path.startswith("/api/lm/download-progress/")
and exc.status == 404
):
logger_method = logger.debug
logger_method(
"API %s %s returned HTTP %d: %s",
request.method,
+12 -5
View File
@@ -1998,9 +1998,11 @@ class ModelDownloadHandler:
item_id=item_id, download_id=download_id
)
if item is None:
# Missing or non-retryable history entry is a business
# outcome, not a routing error: 200 lets the extension's
# apiFetch 404-fallback and error middleware stay quiet.
return web.json_response(
{"success": False, "error": "History item not found or not retryable"},
status=404,
{"success": False, "error": "History item not found or not retryable"}
)
return web.json_response({"success": True, "item": item})
except Exception as exc:
@@ -2051,8 +2053,12 @@ class ModelDownloadHandler:
completed_at=completed_at,
)
if item is None:
# A missing queue item (already completed, or never queued) is
# a normal business outcome, not a routing error. Return 200
# so the browser extension's apiFetch 404-fallback and the
# error middleware stay quiet.
return web.json_response(
{"success": False, "error": "Download not found in queue"}, status=404
{"success": False, "error": "Download not found in queue"}
)
return web.json_response({"success": True, "item": item})
except Exception as exc:
@@ -2094,9 +2100,10 @@ class ModelDownloadHandler:
service = await DownloadQueueService.get_instance()
updated = await service.update_status(download_id, status)
if not updated:
# Same rationale as complete_download_in_queue: a missing
# queue item is a business outcome, not a routing error.
return web.json_response(
{"success": False, "error": "Download not found in queue"},
status=404,
{"success": False, "error": "Download not found in queue"}
)
return web.json_response({"success": True})
except Exception as exc: