Skip to content

[BUG] WebDAV 服务器不兼容RFC 9110 HTTP Semantics(ETag / Preconditions) #3064

Description

@jyeric

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 OpenList issue, not caused by other reasons (such as network, dependencies, or operation).

  • I believe this issue must be handled by OpenList and 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.1RFC9110 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,内容被覆盖 错误
覆盖已有文件时的状态码 200204 始终返回 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

  • I used AI tools to generate this content
  • I did not use AI tools to generate this content

AI model used

gpt-5.6-sol

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    invalidInvalid Content/Cannot Reproduce

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions