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支持 | 默认值 |
|---|---|---|
| PROPFIND | 0, 1, infinity | infinity |
| COPY | 0, infinity | infinity |
| MOVE | infinity(忽略其他值) | infinity |
| LOCK | 0, infinity | infinity |
| 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>)
用途
- 提交锁令牌 - 证明客户端持有锁
- 条件请求 - 基于ETag的条件执行
- 逻辑组合 - 支持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头的匹配规则
- 锁令牌匹配 - 检查提交的令牌是否与资源锁匹配
- ETag匹配 - 检查实体标签是否匹配
- 逻辑评估 - 从左到右评估,支持短路
使用场景
场景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头快速参考
| 头部 | 用于方法 | 必需/可选 | 说明 |
|---|---|---|---|
| DAV | OPTIONS | 响应 | 服务器支持的功能级别 |
| Depth | PROPFIND, COPY, LOCK | 可选 | 操作深度 |
| Destination | COPY, MOVE | 必需 | 目标URL |
| If | 所有方法 | 可选 | 条件执行和锁令牌提交 |
| Lock-Token | UNLOCK | 必需 | 要删除的锁令牌 |
| Overwrite | COPY, MOVE | 可选 | 是否覆盖目标 |
| Timeout | LOCK | 可选 | 建议的锁超时 |
本章总结:第10章定义了WebDAV的7个专用HTTP头部,这些头部扩展了HTTP/1.1的能力,支持深度操作(Depth)、资源操作(Destination, Overwrite)、锁定管理(Lock-Token, Timeout)和条件执行(If)。正确使用这些头部对于实现可靠的WebDAV客户端和服务器至关重要。