Jackrabbit WebDAV 如何生成 eTag header?

How does Jackrabbit WebDAV generate eTag header?

我在 Tomcat 有一个 Jackrabbit WebDAV 服务器 运行,我想知道 ETag header 值是如何生成的。是什么 class 产生的?

如何根据 Jackrabbit 存储库中的初始文件和路径使用 Java 生成它?

预期流程:

  1. 初始文件上传到服务器
  2. 如果客户端正在上传新文件:计算ETag并与服务器上文件对应的ETag进行比较。
  3. 如果值相同 - 不上传文件,向客户端发送响应。如果值不同 - 替换服务器上的文件。

相信服务器会使用jcr:etag属性(https://docs.adobe.com/content/docs/en/spec/jcr/2.0/3_Repository_Model.html#3.7.12.1%20mix:etag),否则会尝试生成一些基于时间戳和文件长度。

后来在 Jackrabbit 源代码中我发现了这个:

if (length > IOUtil.UNDEFINED_LENGTH && modTime > IOUtil.UNDEFINED_TIME) {
    String etag = "\"" + length + "-" + modTime + "\"";
    context.setETag(etag);
}

其中:modTime = Callendar#getTimeInMillis();

因此 etag 是在下一个模式上生成的:大小 以字节为单位 - 修改日期 转换为 Long。