OpenListTeam / OpenListTeam/OpenList
[BUG] S3 服务器不兼容RFC 9110 HTTP Semantics(Preconditions)
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 24.7k
- Forks
- 2.3k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 36
Description
请确认以下事项
-
我已确认阅读并同意 AGPL-3.0 第15条 。
本程序不提供任何明示或暗示的担保,使用风险由您自行承担。 -
我已确认阅读并同意 AGPL-3.0 第16条 。
无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。 -
我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。
-
我已确认阅读了OpenList文档。
-
我已确认没有重复的问题或讨论。
-
我已确认是
OpenList的问题,而不是其他原因(例如 网络 ,依赖或操作)。 -
我认为此问题必须由
OpenList处理,而非第三方。 -
我已确认这个问题在最新版本中没有被修复。
-
我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。
OpenList 版本(必填)
v4.2.4
使用的存储驱动(必填)
local
问题描述(必填)
类似于 #3065 ,S3 服务器经测试也没有实现条件写入功能,却返回200。
以下报告由AI生成:
| 测试项 | 实际结果 | 判断 |
|---|---|---|
不存在的对象,携带 If-None-Match: * 创建 |
200,创建成功 |
符合预期 |
已存在的对象,携带 If-None-Match: * 再次写入 |
200,原内容被覆盖 |
不支持仅当不存在时写入 |
携带错误的 If-Match 写入 |
200,原内容被覆盖 |
未校验版本 |
| 携带当前 PUT 返回的 ETag 写入 | 200,更新成功 |
单独这一项不能证明支持条件写入 |
| 更新后,携带旧 PUT ETag 再次写入 | 200,新版本被旧版本请求覆盖 |
不支持乐观锁 |
对不存在的对象使用 If-Match |
200,对象被创建 |
未执行匹配条件 |
| PUT 响应中的 ETag | 有非空值,内容变化后值变化 | 上传响应提供 ETag |
| GET / HEAD 响应中的 ETag | 均为 ETag: "" |
未提供可用于版本比较的有效值 |
S3 服务没有实现ETag,ETag实现在 RFC 9110 HTTP Semantics 并非必须实现的项目。但应该可以和webdav修复一起实现。 #3066
日志(必填)
[22:38:47] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt: failed to get obj: object not found
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 404 | 531.7µs | 127.0.0.1 | HEAD "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 2.1ms | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 507.9µs | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 531µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 525.8µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 534µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 529.7µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 529.5µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 535.2µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 534.9µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 204 | 525.7µs | 127.0.0.1 | DELETE "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt: failed to get obj: object not found
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 404 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 538.8µs | 127.0.0.1 | PUT "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 200 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 204 | 0s | 127.0.0.1 | DELETE "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:38:47] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt: failed to get obj: object not found
[22:38:47] [INFO] [openlist] [GIN] 2026/09/10 - 22:38:47 | 404 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-1a077c320c2c447483ddf51f415467f2.txt"
[22:39:21] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt: failed to get obj: object not found
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 404 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 554µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 531.4µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 532.9µs | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 538.8µs | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 530.3µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 1.07ms | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:21] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:21 | 200 | 541.1µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 540.8µs | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 531.5µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 525.4µs | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 535.5µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 538.3µs | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 0s | 127.0.0.1 | GET "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 204 | 0s | 127.0.0.1 | DELETE "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt: failed to get obj: object not found
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 404 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 1.06ms | 127.0.0.1 | PUT "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 200 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 204 | 0s | 127.0.0.1 | DELETE "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
[22:39:22] [WARN] [openlist] failed get /openlist-local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt: failed to get obj: object not found
[22:39:22] [INFO] [openlist] [GIN] 2026/09/10 - 22:39:22 | 404 | 0s | 127.0.0.1 | HEAD "/local/s3-lock-probe-521e36b544224f20bb1d24b489a93c97.txt"
配置文件内容(必填)
Irrelevant
复现链接(可选)
No response
AI生成内容
- 我使用了AI工具生成此内容
- 我没有使用AI工具生成此内容
AI模型是
gpt-5.6-sol
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
The report exercises PUT, GET, HEAD, and DELETE on /local/... with If-None-Match and If-Match; start by reproducing those conditional-write cases against the S3 storage path and trace how the HTTP preconditions reach the storage driver. Done means failed preconditions no longer overwrite or create objects, while valid conditions work and regression coverage exists.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100