10. 分布式创作的HTTP头 (HTTP Headers for Distributed Authoring)
WebDAV定义了几个新的HTTP头并扩展了现有头以支持分布式创作功能。
10.1 DAV头 (DAV Header)
目的 (Purpose): 指示WebDAV合规性类别和支持的功能。
语法 (Syntax):
DAV = "DAV" ":" #(compliance-class)
compliance-class = ("1" | "2" | "3" | extend)
示例 (Example):
DAV: 1, 2, 3, \`http://example.com/my-features\`
合规性类别 (Compliance Classes):
- 类别1 (Class 1): 基本WebDAV支持(PROPFIND、PROPPATCH、COPY、MOVE、MKCOL等)
- 类别2 (Class 2): 类别1+锁定支持(LOCK、UNLOCK)
- 类别3 (Class 3): 类别1+有序集合
用法 (Usage): 必须在OPTIONS响应中返回。可以在其他响应中返回。
10.2 Depth头 (Depth Header)
目的 (Purpose): 指定应用于集合的方法的操作深度。
语法 (Syntax):
Depth = "Depth" ":" ("0" | "1" | "infinity")
值 (Values):
- 0: 仅应用于目标资源
- 1: 应用于目标和直接子项
- infinity: 递归应用于目标和所有后代
示例 (Example):
PROPFIND /collection/ HTTP/1.1
Depth: 1
默认行为 (Default Behavior):
- PROPFIND: 如果省略,视为
infinity - LOCK: 如果省略,视为
infinity - COPY/MOVE: 如果省略,视为
infinity
约束 (Constraints): 由于资源约束,某些服务器可能拒绝Depth: infinity。
10.3 Destination头 (Destination Header)
目的 (Purpose): 指定COPY和MOVE操作的目标URI。
语法 (Syntax):
Destination = "Destination" ":" Simple-ref
示例 (Example):
COPY /source HTTP/1.1
Host: example.com
Destination: http://example.com/dest
要求 (Requirements):
- 必须是绝对URI
- 必须与Request-URI在同一主机上(对于大多数实现)
- 应用URI编码规则
10.4 If头 (If Header)
目的 (Purpose): 基于状态令牌(ETag或锁令牌)提供条件执行。
语法 (Syntax):
If = "If" ":" ( 1*No-tag-list | 1*Tagged-list )
No-tag-list = List
Tagged-list = Resource-Tag 1*List
List = "(" 1*Condition ")"
Condition = ["Not"] (State-token | "[" entity-tag "]")
State-token = Coded-URL
示例 (Examples):
1. 简单锁令牌提交 (Simple Lock Token Submission):
PUT /resource HTTP/1.1
If: (<opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>)
2. 多个条件(OR):
DELETE /resource HTTP/1.1
If: (<locktoken1>) (<locktoken2>)
3. 多个条件(AND):
MOVE /resource HTTP/1.1
If: (<locktoken>) (["etag123"])
4. 标记列表(多个资源):
COPY /a HTTP/1.1
Destination: /b
If: </a> (<locktoken-a>) </b> (Not <locktoken-b>)
5. NOT条件:
PUT /resource HTTP/1.1
If: (Not <DAV:no-lock>)
求值 (Evaluation):
()内的列表进行AND运算- 多个列表进行OR运算
Not否定条件- If头求值失败返回
412 Precondition Failed
10.5 Lock-Token头 (Lock-Token Header)
目的 (Purpose): 为UNLOCK操作提供锁令牌。
语法 (Syntax):
Lock-Token = "Lock-Token" ":" Coded-URL
示例 (Example):
UNLOCK /resource HTTP/1.1
Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
要求 (Requirements):
- 必须与UNLOCK方法一起使用
- 恰好包含一个锁令牌
- 锁令牌必须在尖括号
< >中
10.6 Overwrite头 (Overwrite Header)
目的 (Purpose): 指定是否在COPY/MOVE中覆盖目标资源。
语法 (Syntax):
Overwrite = "Overwrite" ":" ("T" | "F")
值 (Values):
- T (True): 如果存在则覆盖目标(默认)
- F (False): 如果目标存在则失败(返回412)
示例 (Example):
COPY /source HTTP/1.1
Destination: http://example.com/dest
Overwrite: F
默认 (Default): 如果省略,视为T。
行为 (Behavior):
- 使用
Overwrite: F时,如果目标存在则返回412 Precondition Failed - 使用
Overwrite: T时,目标被静默替换
10.7 Timeout头 (Timeout Header)
目的 (Purpose): 指定请求的锁超时持续时间。
语法 (Syntax):
Timeout = "Timeout" ":" 1#TimeType
TimeType = ("Second-" DAVTimeOutVal | "Infinite")
DAVTimeOutVal = 1*DIGIT
示例 (Examples):
LOCK /resource HTTP/1.1
Timeout: Second-3600
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-3600
语义 (Semantics):
- Second-n: 请求锁定n秒
- Infinite: 请求无超时的锁
- 多个值表示优先级顺序
- 服务器从客户端列表中选择或使用自己的值
- 响应中返回实际授予的超时
响应示例 (Response Example):
<D:timeout>Second-3600<D:timeout>
头汇总表 (Header Summary Table)
| 头 | 方法 | 必需 | 默认 | 值 |
|---|---|---|---|---|
| DAV | OPTIONS | MUST | - | 1, 2, 3, extend |
| Depth | PROPFIND, LOCK, COPY, MOVE | MAY | infinity | 0, 1, infinity |
| Destination | COPY, MOVE | MUST | - | Absolute URI |
| If | All | MAY | - | State-tokens, ETags |
| Lock-Token | UNLOCK | MUST | - | Lock token URI |
| Overwrite | COPY, MOVE | MAY | T | T, F |
| Timeout | LOCK | MAY | Server-decided | Second-n, Infinite |
使用模式 (Usage Patterns)
模式1: 带锁的条件更新 (Conditional Update with Lock)
PUT /file.txt HTTP/1.1
If: (<opaquelocktoken:...>)
Content-Type: text/plain
New content
模式2: 安全COPY(不覆盖)
COPY /source HTTP/1.1
Destination: /dest
Overwrite: F
Depth: infinity
模式3: 带超时偏好的锁定 (Lock with Timeout Preference)
LOCK /resource HTTP/1.1
Timeout: Infinite, Second-7200, Second-3600
Depth: 0
模式4: 复杂If条件 (Complex If Conditions)
DELETE /locked-resource HTTP/1.1
If: (<locktoken>) (["current-etag"])
注意 (Note): 有关包括ABNF语法在内的完整头规范,请参见RFC 4918第10节。