Skip to content

Ensure static file responses remain consistent during on-disk replacement - #1

Merged
HanminYIN merged 1 commit into
mainfrom
codex
Aug 7, 2026
Merged

HanminYIN merged 1 commit into
mainfrom
codex

Conversation

@HanminYIN

Copy link
Copy Markdown
Owner

Motivation

  • 静态文件在部署或替换时可能被原子替换,单独调用 stat() 然后再读取文件会导致响应头(如 Content-Length/ETag)与实际发送的主体不一致,从而让客户端挂起或误解析后续响应。
  • 需要在服务器端保证响应头和响应体来自同一文件快照以避免这种竞态条件。

Description

  • 修改 server.py 中的静态文件处理逻辑(MedicationHandler._serve_static)以先以二进制模式打开文件,使用同一文件描述符读取主体(如果需要)并通过 os.fstat() 获取文件元数据,从而将元数据和主体绑定到同一版本。
  • 根据实际读取到的主体长度计算并设置 Content-Length,而不是直接使用单独的 stat().st_size。
  • 将原先直接调用 candidate.read_bytes() 的写入改为写入先前读取的 body 缓存。
  • 新增回归测试 test_static_response_stays_consistent_when_asset_is_replaced(在 tests/test_server.py)以模拟在打开资源后立即替换磁盘文件的场景,并验证返回内容与 Content-Length 的一致性。

Testing

  • 已运行完整 Python 单元测试套件:python -m unittest discover -s tests -v, 所有自动化单元测试通过(80 个测试通过)。
  • 针对静态文件行为的回归测试 tests.test_server.MedicationServerTest.test_static_files_support_head_and_conditional_requests 和 test_static_response_stays_consistent_when_asset_is_replaced 已单独运行并通过。
  • 前端端到端测试 npm run test:e2e 在当前环境中失败,因为运行环境缺少 Playwright 的浏览器可执行文件(需要运行 npx playwright install 来安装浏览器),因此这部分自动化在本次变更验证中未通过。

Codex Task

@HanminYIN
HanminYIN merged commit 3bfcf1f into main Aug 7, 2026
1 check passed
@HanminYIN
HanminYIN deleted the codex branch August 8, 2026 04:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant