Please confirm the following
OpenList Version (required)
v4.2.4
Storage Driver Used (required)
local
Bug Description (required)
If-Match, If-None-Match, ETag等使用可以有效避免文件被多个进程争抢覆盖(乐观锁)。目前openlist的webdav服务器实现上不符合 RFC9110 section-13.1.1和RFC9110 section-8.8.3,在不应覆盖文件的情况下错误的覆盖了文件。同时返回201 Created
下面是测试结果(以下为AI生成):
条件写入测试结果
| 测试 |
正确行为 |
实际行为 |
结果 |
创建不存在的随机文件,If-None-Match: * |
创建成功 |
201,创建成功 |
正常 |
文件已存在,If-None-Match: * |
412,不得覆盖 |
201,内容被覆盖 |
错误 |
If-None-Match: 当前 ETag |
412,不得覆盖 |
201,内容被覆盖 |
错误 |
If-Match: 错误 ETag |
412,不得覆盖 |
201,内容被覆盖 |
错误 |
If-Match: 当前 ETag |
更新成功 |
201,内容更新 |
条件无法证明生效 |
If-Match: 过期 ETag |
412,不得覆盖 |
201,内容被覆盖 |
错误 |
| 覆盖已有文件时的状态码 |
200 或 204 |
始终返回 201 Created |
错误 |
此外,文件修改后 ETag 仍然一致,强 ETag 相同应当表示两个资源表示逐字节相同。在ETag的实现上也存在问题。
Logs (required)
[21:15:02] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:02 | 200 | 0s | 127.0.0.1 | OPTIONS "/dav/openlist-local"
[21:15:02] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:02 | 207 | 0s | 127.0.0.1 | PROPFIND "/dav/openlist-local"
[21:15:14] [WARN] [openlist] failed get /openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt: failed to get obj: object not found
[21:15:14] [INFO] [openlist] ERRO[2026-09-10 21:15:14] HEAD /dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt object not found
[N/A] [INFO] [openlist] failed to get obj
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 404 | 506.1µs | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 1.59ms | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 207 | 0s | 127.0.0.1 | PROPFIND "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 536.6µs | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 207 | 0s | 127.0.0.1 | PROPFIND "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 533.1µs | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 529.4µs | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 506.6µs | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 207 | 0s | 127.0.0.1 | PROPFIND "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 533.1µs | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 207 | 0s | 127.0.0.1 | PROPFIND "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 201 | 524µs | 127.0.0.1 | PUT "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 200 | 0s | 127.0.0.1 | GET "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 204 | 0s | 127.0.0.1 | DELETE "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
[21:15:14] [WARN] [openlist] failed get /openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt: failed to get obj: object not found
[21:15:14] [INFO] [openlist] ERRO[2026-09-10 21:15:14] HEAD /dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt object not found
[N/A] [INFO] [openlist] failed to get obj
[21:15:14] [INFO] [openlist] [GIN] 2026/09/10 - 21:15:14 | 404 | 0s | 127.0.0.1 | HEAD "/dav/openlist-local/webdav-etag-probe-70f944bf753142f28832e83e4fae2058.txt"
Configuration File Content (required)
Irrelevant
Reproduction Link (optional)
No response
AI Generated Content
AI model used
gpt-5.6-sol
Please confirm the following
I have read and agree to AGPL-3.0 Section 15 .
The program is provided "as is" without any warranties; you bear all risks of using it.
I have read and agree to AGPL-3.0 Section 16 .
The copyright holders and distributors are not liable for any damages resulting from the use or inability to use the program.
I confirm my description is clear, polite, helps developers quickly locate the issue, and complies with community rules.
I have read the OpenList documentation.
I confirm there are no duplicate issues or discussions.
I confirm this is an
OpenListissue, not caused by other reasons (such as network, dependencies, or operation).I believe this issue must be handled by
OpenListand not by a third party.I confirm this issue is not fixed in the latest version.
I have not read these checkboxes and therefore I just ticked them all, Please close this issue.
OpenList Version (required)
v4.2.4
Storage Driver Used (required)
local
Bug Description (required)
If-Match, If-None-Match, ETag等使用可以有效避免文件被多个进程争抢覆盖(乐观锁)。目前openlist的webdav服务器实现上不符合 RFC9110 section-13.1.1和RFC9110 section-8.8.3,在不应覆盖文件的情况下错误的覆盖了文件。同时返回
201 Created下面是测试结果(以下为AI生成):
条件写入测试结果
If-None-Match: *201,创建成功If-None-Match: *412,不得覆盖201,内容被覆盖If-None-Match: 当前 ETag412,不得覆盖201,内容被覆盖If-Match: 错误 ETag412,不得覆盖201,内容被覆盖If-Match: 当前 ETag201,内容更新If-Match: 过期 ETag412,不得覆盖201,内容被覆盖200或204201 Created此外,文件修改后 ETag 仍然一致,强 ETag 相同应当表示两个资源表示逐字节相同。在ETag的实现上也存在问题。
Logs (required)
Configuration File Content (required)
Irrelevant
Reproduction Link (optional)
No response
AI Generated Content
AI model used
gpt-5.6-sol