Skip to main content

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> (&lt;locktoken-a>) </b> (Not &lt;locktoken-b>)

5. NOT条件:

PUT /resource HTTP/1.1
If: (Not &lt;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: &lt;opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>

要求 (Requirements):

  • 必须与UNLOCK方法一起使用
  • 恰好包含一个锁令牌
  • 锁令牌必须在尖括号&lt; >

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):

&lt;D:timeout>Second-3600&lt;D:timeout>

头汇总表 (Header Summary Table)

方法必需默认
DAVOPTIONSMUST-1, 2, 3, extend
DepthPROPFIND, LOCK, COPY, MOVEMAYinfinity0, 1, infinity
DestinationCOPY, MOVEMUST-Absolute URI
IfAllMAY-State-tokens, ETags
Lock-TokenUNLOCKMUST-Lock token URI
OverwriteCOPY, MOVEMAYTT, F
TimeoutLOCKMAYServer-decidedSecond-n, Infinite

使用模式 (Usage Patterns)

模式1: 带锁的条件更新 (Conditional Update with Lock)

PUT /file.txt HTTP/1.1
If: (&lt;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: (&lt;locktoken>) (["current-etag"])

注意 (Note): 有关包括ABNF语法在内的完整头规范,请参见RFC 4918第10节。