From 118a0c0b3eb9f2573093c28b420ee8c0bf3e887e Mon Sep 17 00:00:00 2001 From: LLMxPM Date: Tue, 27 Oct 2026 13:34:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E4=BA=A7=E7=89=A9=20HEAD=20=E4=B8=8B=E8=BD=BD=E9=A2=84?= =?UTF-8?q?=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/api/routes/build_jobs.py | 1 + backend/tests/integration/test_project_build.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/backend/app/api/routes/build_jobs.py b/backend/app/api/routes/build_jobs.py index 21819342..783fdf25 100644 --- a/backend/app/api/routes/build_jobs.py +++ b/backend/app/api/routes/build_jobs.py @@ -98,6 +98,7 @@ async def get_project_build_job( @router.get("/projects/{project_id}/build-jobs/{job_id}/artifact") +@router.head("/projects/{project_id}/build-jobs/{job_id}/artifact", include_in_schema=False) async def download_project_build_artifact( project_id: int, job_id: int, diff --git a/backend/tests/integration/test_project_build.py b/backend/tests/integration/test_project_build.py index 61b886d9..6639a7fa 100644 --- a/backend/tests/integration/test_project_build.py +++ b/backend/tests/integration/test_project_build.py @@ -1189,6 +1189,15 @@ async def fake_build_snapshot( # noqa: ANN001 assert download_response.headers["content-type"] == "application/zip" assert download_response.content == archive_content + # Editor 下载前先以 HEAD 检查鉴权、产物存在性和文件名。 + head_response = await authenticated_client.head( + f"/api/projects/{project_id}/build-jobs/{build_job['id']}/artifact" + ) + assert head_response.status_code == 200 + assert head_response.headers["content-type"] == "application/zip" + assert head_response.headers["content-length"] == str(len(archive_content)) + assert head_response.content == b"" + access_response = await authenticated_client.post( f"/api/projects/{project_id}/build-jobs/{build_job['id']}/access" ) @@ -1293,6 +1302,11 @@ async def fake_build_snapshot( # noqa: ANN001 assert deleted_download_response.status_code == 404 assert deleted_download_response.json()["code"] == "BUILD_ARTIFACT_NOT_FOUND" + deleted_head_response = await authenticated_client.head( + f"/api/projects/{project_id}/build-jobs/{build_job['id']}/artifact" + ) + assert deleted_head_response.status_code == 404 + # 产物删除后:即使票据仍在有效期内,也已读不到任何内容。 deleted_proxy_response = await authenticated_client.get( f"{isolated_preview_origin()}/build-artifacts/{project_id}/{build_job['id']}/",