メインコンテンツまでスキップ

10. HTTP Headers for Distributed Authoring (用于分布式创作的HTTP头)

WebDAV定义了几个新的HTTP头部,用于支持分布式创作功能。

10.1 DAV Header (DAV头)

DAV头指示服务器支持的WebDAV功能级别。

语法

DAV: 1, 2, 3, access-control, calendar-access

合规性级别

  • 1: 基本WebDAV支持(PROPFIND, PROPPATCH, MKCOL, GET/HEAD扩展, PUT扩展, DELETE扩展, OPTIONS, COPY, MOVE)
  • 2: 包括级别1 + LOCK和UNLOCK支持
  • 3: 包括级别2 + 有序集合支持(可选)

使用场景

OPTIONS响应

OPTIONS /resource HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
DAV: 1, 2
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK

10.2 Depth Header (Depth头)

Depth头用于指定操作应该应用于资源层次结构的深度。

语法

Depth: 0 | 1 | infinity

值的含义

  • 0: 仅应用于目标资源本身
  • 1: 应用于资源及其直接成员
  • infinity: 递归应用于资源及其所有后代

适用方法

方法Depth支持默认值
PROPFIND0, 1, infinityinfinity
COPY0, infinityinfinity
MOVEinfinity(忽略其他值)infinity
LOCK0, infinityinfinity
DELETE忽略(总是递归)N/A

示例

<!-- 仅查询集合本身的属性 -->
PROPFIND /collection/ HTTP/1.1
Host: example.com
Depth: 0

<!-- 查询集合及其直接成员 -->
PROPFIND /collection/ HTTP/1.1
Host: example.com
Depth: 1

10.3 Destination Header (Destination头)

Destination头指定COPY或MOVE操作的目标URL。

语法

Destination: absoluteURI

要求

  • 必需: COPY和MOVE方法必须包含此头
  • 绝对URI: 必须是完整的绝对URI
  • 同一服务器: 通常要求源和目标在同一服务器上

示例

COPY /source/file.txt HTTP/1.1
Host: example.com
Destination: http://example.com/destination/file.txt
Overwrite: T

MOVE /old-name.doc HTTP/1.1
Host: example.com
Destination: http://example.com/new-name.doc

10.4 If Header (If头)

If头提供了一种条件化执行WebDAV方法的机制,用于提交锁令牌和ETag。

语法

If头有两种形式:

No-tag-list形式

If: (<locktoken>) ([etag])

Tagged-list形式

If: <resource-url> (<locktoken>)

用途

  1. 提交锁令牌 - 证明客户端持有锁
  2. 条件请求 - 基于ETag的条件执行
  3. 逻辑组合 - 支持AND和OR逻辑

示例

提交锁令牌

PUT /locked-resource HTTP/1.1
Host: example.com
If: (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
Content-Type: text/plain

Updated content

多个条件

DELETE /resource HTTP/1.1
Host: example.com
If: `http://example.com/resource`
(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)
(["e0-b2-1a2"])

NOT条件

If: (Not <urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)

If头的匹配规则

  1. 锁令牌匹配 - 检查提交的令牌是否与资源锁匹配
  2. ETag匹配 - 检查实体标签是否匹配
  3. 逻辑评估 - 从左到右评估,支持短路

使用场景

场景1:修改锁定资源

PUT /locked-doc HTTP/1.1
If: (<urn:uuid:lock-token-here>)

场景2:COPY到锁定目标

COPY /source HTTP/1.1
Destination: http://example.com/locked-dest
If: `http://example.com/locked-dest`
(<urn:uuid:dest-lock-token>)

场景3:条件更新

PUT /resource HTTP/1.1
If: (["etag-value"])

10.5 Lock-Token Header (Lock-Token头)

Lock-Token头用于UNLOCK方法中指定要删除的锁。

语法

Lock-Token: <uri>

使用

仅用于UNLOCK

UNLOCK /resource HTTP/1.1
Host: example.com
Lock-Token: <urn:uuid:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>

HTTP/1.1 204 No Content

与If头的区别

  • Lock-Token: 仅用于UNLOCK,指定要删除的锁
  • If: 用于其他方法,提交锁令牌以证明授权

10.6 Overwrite Header (Overwrite头)

Overwrite头指定COPY或MOVE操作是否应覆盖目标资源。

语法

Overwrite: T | F

  • T (True): 覆盖目标资源(默认)
  • F (False): 不覆盖,如果目标存在则失败

行为

Overwrite: T

  • 如果目标存在,先删除目标
  • 然后创建新资源
  • 返回204 No Content

Overwrite: F

  • 如果目标存在,操作失败
  • 返回412 Precondition Failed
  • 不修改任何资源

示例

<!-- 不覆盖现有文件 -->
COPY /source.txt HTTP/1.1
Host: example.com
Destination: http://example.com/dest.txt
Overwrite: F

<!-- 如果dest.txt存在 -->
HTTP/1.1 412 Precondition Failed

<!-- 如果dest.txt不存在 -->
HTTP/1.1 201 Created

10.7 Timeout Request Header (Timeout请求头)

Timeout头用于LOCK请求中建议锁的超时时间。

语法

Timeout: Second-<seconds> | Infinite

示例

LOCK /resource HTTP/1.1
Host: example.com
Timeout: Second-3600

<!-- 或者请求无限超时 -->
Timeout: Infinite

<!-- 多个超时值(按优先级) -->
Timeout: Infinite, Second-604800, Second-86400

服务器行为

  • 可以拒绝: 服务器可以忽略客户端的建议
  • 返回实际值: 响应中必须包含服务器选择的超时值
  • 安全限制: 服务器可以限制最大超时时间

响应中的Timeout

<D:activelock>
<D:timeout>Second-3600</D:timeout>
...
</D:activelock>

HTTP头快速参考

头部用于方法必需/可选说明
DAVOPTIONS响应服务器支持的功能级别
DepthPROPFIND, COPY, LOCK可选操作深度
DestinationCOPY, MOVE必需目标URL
If所有方法可选条件执行和锁令牌提交
Lock-TokenUNLOCK必需要删除的锁令牌
OverwriteCOPY, MOVE可选是否覆盖目标
TimeoutLOCK可选建议的锁超时

本章总结:第10章定义了WebDAV的7个专用HTTP头部,这些头部扩展了HTTP/1.1的能力,支持深度操作(Depth)、资源操作(Destination, Overwrite)、锁定管理(Lock-Token, Timeout)和条件执行(If)。正确使用这些头部对于实现可靠的WebDAV客户端和服务器至关重要。