15. DAV 属性
15. DAV 属性
对于 DAV 属性, 属性名称也与包含其值的 XML 元素名称相同. 在下面各小节中, 每节最后一行使用 [REC-XML] 中定义的格式给出元素类型声明. 如果存在 "值 (Value)" 字段, 它会使用 BNF 进一步限制 XML 元素可包含的内容, 也就是进一步限制 PCDATA 元素的取值.
受保护属性 (protected property) 是指不能通过 PROPPATCH 请求更改的属性. 可能存在其他请求会导致受保护属性发生变化, 例如 LOCK 请求会影响 DAV:lockdiscovery 的值. 注意, 某个给定属性可能在一种资源类型上受保护, 但在另一种资源类型上不受保护.
计算属性 (computed property) 是指其值由计算定义的属性, 计算可以基于该资源的内容和其他属性, 甚至可以基于其他资源. 计算属性始终是受保护属性.
COPY 和 MOVE 行为指本地 COPY 和 MOVE 操作.
对于基于 HTTP GET 响应头定义的属性 (DAV:get*), 头字段值可以包含 [RFC2616] 第 4.2 节中定义的 LWS. 服务器实现者在将这些值用作 WebDAV 属性值之前, 应该 去除其中的 LWS.
15.1. creationdate 属性
名称: creationdate
目的: 记录资源创建的时间和日期.
值: date-time (在 [RFC3339] 中定义, 见第 5.6 节中的 ABNF.)
受保护: 可以 受保护. 某些服务器允许更改 DAV:creationdate, 以反映文档创建的时间, 如果该时间对用户而言比上传时间更有意义. 因此, 客户端 不应该 在同步逻辑中使用此属性, 而应使用 DAV:getetag.
COPY/MOVE 行为: 在 MOVE 操作期间, 此属性值 应该 保留, 但当通过 COPY 创建资源时通常会重新初始化. 在 COPY 中不应设置此属性.
描述: DAV:creationdate 属性 应该 定义在所有符合 DAV 的资源上. 如果存在, 它包含资源创建时刻的时间戳. 不能持久记录创建日期的服务器 应该 改为让该属性保持未定义, 即报告 "Not Found".
<!ELEMENT creationdate (#PCDATA) >
15.2. displayname 属性
名称: displayname
目的: 为资源提供适合向用户展示的名称.
值: 任意文本.
受保护: 不应该 受保护. 注意, 实现 [RFC2518] 的服务器可能已将其设为受保护属性, 因为这是新的要求.
COPY/MOVE 行为: 在 COPY 和 MOVE 操作中, 此属性值 应该 被保留.
描述: 包含适合向用户展示的资源描述. 此属性定义在资源上, 因此无论使用哪个 Request-URI 检索该资源, 它 应该 具有相同的值. 因而, 基于 Request-URI 计算此属性的做法已弃用. 虽然通用客户端可能会向最终用户显示属性值, 但客户端 UI 设计者必须理解, 标识资源的方法仍然是 URL. 对 DAV:displayname 的更改不会向服务器发出移动或复制操作, 只是更改单个资源上的一项元数据. 即使在同一个集合中, 两个资源也可以具有相同的 DAV:displayname 值.
<!ELEMENT displayname (#PCDATA) >
15.3. getcontentlanguage 属性
名称: getcontentlanguage
目的: 包含 Content-Language 头字段值, 该值来自 [RFC2616] 第 14.12 节, 表示不带 accept 头字段的 GET 会返回的值.
值: language-tag (language-tag 在 [RFC2616] 第 3.10 节中定义)
受保护: 不应该 受保护, 以便客户端可以重置语言. 注意, 实现 [RFC2518] 的服务器可能已将其设为受保护属性, 因为这是新的要求.
COPY/MOVE 行为: 在 COPY 和 MOVE 操作中, 此属性值 应该 被保留.
描述: 对于任何在 GET 中返回 Content-Language 头字段的 DAV 兼容资源, 必须 定义 DAV:getcontentlanguage 属性.
<!ELEMENT getcontentlanguage (#PCDATA) >
15.4. getcontentlength 属性
名称: getcontentlength
目的: 包含不带 accept 头字段的 GET 所返回的 Content-Length 头字段.
值: 见 [RFC2616] 第 14.13 节.
受保护: 此属性是计算得出的, 因此受保护.
描述: 对于任何响应 GET 时返回 Content-Length 头字段的 DAV 兼容资源, 必须 定义 DAV:getcontentlength 属性.
COPY/MOVE 行为: 此属性值取决于目标资源的大小, 而不是源资源上的属性值.
<!ELEMENT getcontentlength (#PCDATA) >
15.5. getcontenttype 属性
名称: getcontenttype
目的: 包含 Content-Type 头字段值, 该值来自 [RFC2616] 第 14.17 节, 表示不带 accept 头字段的 GET 会返回的值.
值: media-type (在 [RFC2616] 第 3.7 节中定义)
受保护: 如果服务器倾向于自行分配内容类型, 则可能受保护 (另见第 9.7.1 节的讨论).
COPY/MOVE 行为: 在 COPY 和 MOVE 操作中, 此属性值 应该 被保留.
描述: 对于任何响应 GET 时返回 Content-Type 头字段的 DAV 兼容资源, 必须 定义此属性.
<!ELEMENT getcontenttype (#PCDATA) >
15.6. getetag 属性
名称: getetag
目的: 包含 ETag 头字段值, 该值来自 [RFC2616] 第 14.19 节, 表示不带 accept 头字段的 GET 会返回的值.
值: entity-tag (在 [RFC2616] 第 3.11 节中定义)
受保护: 必须 受保护, 因为此值由服务器创建并控制.
COPY/MOVE 行为: 此属性值取决于目标资源的最终状态, 而不是源资源上的属性值. 另请注意第 8.8 节中的考虑事项.
描述: 对于任何返回 Etag 头字段的 DAV 兼容资源, 必须 定义 getetag 属性. 有关 ETag 语义的完整定义, 请参阅 RFC 2616 第 3.11 节. 有关 WebDAV 中 ETag 的讨论, 请参阅第 8.6 节.
<!ELEMENT getetag (#PCDATA) >
15.7. getlastmodified 属性
名称: getlastmodified
目的: 包含 Last-Modified 头字段值, 该值来自 [RFC2616] 第 14.29 节, 表示不带 accept 头字段的 GET 方法会返回的值.
值: rfc1123-date (在 [RFC2616] 第 3.3.1 节中定义)
受保护: 应该 受保护, 因为一些客户端可能依赖此值来执行适当的缓存行为, 或依赖与此属性关联的 Last-Modified 头字段值.
COPY/MOVE 行为: 此属性值取决于目标资源的最后修改日期, 而不是源资源上的属性值. 注意, 一些服务器实现使用文件系统的修改日期值作为 DAV:getlastmodified 值, 并且即使 HTTP Last-Modified 值 应该 改变, 该值在 MOVE 中仍可被保留. 注意, 由于 [RFC2616] 要求客户端在提供 ETag 时使用 ETag, 实现 ETag 的服务器可以确信客户端会使用比修改日期好得多的机制来进行离线同步或缓存控制. 另请注意第 8.8 节中的考虑事项.
描述: 资源上的最后修改日期 应该 仅反映资源主体, 即 GET 响应, 的变化. 仅属性变化 不应该 导致最后修改日期改变, 因为客户端 可以 依赖最后修改日期来判断何时覆盖现有主体. 对于任何响应 GET 时返回 Last-Modified 头字段的 DAV 兼容资源, 必须 定义 DAV:getlastmodified 属性.
<!ELEMENT getlastmodified (#PCDATA) >
15.8. lockdiscovery 属性
名称: lockdiscovery
目的: 描述资源上的活动锁.
受保护: 必须 受保护. 客户端通过 LOCK 和 UNLOCK 更改锁列表, 而不是通过 PROPPATCH.
COPY/MOVE 行为: 此属性的值取决于目标的锁状态, 而不是源资源上的锁. 请回忆, MOVE 操作不会移动锁.
描述: 返回一份列表, 其中说明谁持有锁, 锁的类型, 超时类型和剩余超时时间, 以及关联的锁令牌. 如果所有者信息被认为敏感, 可以 省略. 如果没有锁但服务器支持锁, 该属性会存在, 但包含零个 'activelock' 元素. 如果存在一个或多个锁, 资源上的每个锁都会出现一个 'activelock' 元素. 就写锁而言, 此属性不可锁定 (第 7 节).
<!ELEMENT lockdiscovery (activelock)* >
15.8.1. 示例 - 检索 DAV:lockdiscovery
请求:
PROPFIND /container/ HTTP/1.1
Host: www.example.com
Content-Length: xxxx
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D='DAV:'>
<D:prop><D:lockdiscovery/><D:prop>
<D:propfind>
响应:
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D='DAV:'>
<D:response>
<D:href>http://www.example.com/container/<D:href>
<D:propstat>
<D:prop>
<D:lockdiscovery>
<D:activelock>
<D:locktype><D:write/><D:locktype>
<D:lockscope><D:exclusive/><D:lockscope>
<D:depth>0<D:depth>
<D:owner>Jane Smith<D:owner>
<D:timeout>Infinite<D:timeout>
<D:locktoken>
<D:href
>urn:uuid:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76<D:href>
<D:locktoken>
<D:lockroot>
<D:href>http://www.example.com/container/<D:href>
<D:lockroot>
<D:activelock>
<D:lockdiscovery>
<D:prop>
<D:status>HTTP/1.1 200 OK<D:status>
<D:propstat>
<D:response>
<D:multistatus>
此资源上有一个独占写锁, 且超时为无限.
15.9. resourcetype 属性
名称: resourcetype
目的: 指定资源的性质.
受保护: 应该 受保护. 资源类型通常由创建资源的操作决定 (MKCOL 与 PUT), 而不是由 PROPPATCH 决定.
COPY/MOVE 行为: 通常, 对资源执行 COPY/MOVE 会在目标处产生相同类型的资源.
描述: 必须 定义在所有 DAV 兼容资源上. 每个子元素标识资源所属的特定类型, 例如 'collection', 它是本规范定义的唯一资源类型 (见第 14.3 节). 如果该元素包含 'collection' 子元素以及其他未识别的元素, 通常应将其视为集合. 如果该元素不包含任何已识别的子元素, 则应将其视为非集合资源. 默认值为空. 此元素 不得 包含文本或混合内容. 任何自定义子元素都被视为资源类型的标识符.
示例: (用于展示可扩展性的虚构示例)
<x:resourcetype xmlns:x="DAV:">
<x:collection/>
<f:search-results xmlns:f="http://www.example.com/ns"/>
<x:resourcetype>
15.10. supportedlock 属性
名称: supportedlock
目的: 提供资源所支持的锁能力列表.
受保护: 必须 受保护. 支持哪些锁机制由服务器决定, 而不是由客户端决定.
COPY/MOVE 行为: 此属性值取决于目标处支持的锁类型, 而不是源资源上该属性的值. 尝试 COPY 到目标的服务器不应尝试在目标处设置此属性.
描述: 返回作用域和访问类型组合的列表, 这些组合可在针对该资源的锁请求中指定. 注意, 实际内容本身受访问控制约束, 因此服务器不需要提供客户端无权查看的信息. 就写锁而言, 此属性不可锁定 (第 7 节).
<!ELEMENT supportedlock (lockentry)* >
15.10.1. 示例 - 检索 DAV:supportedlock
请求:
PROPFIND /container/ HTTP/1.1
Host: www.example.com
Content-Length: xxxx
Content-Type: application/xml; charset="utf-8"
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:prop><D:supportedlock/><D:prop>
<D:propfind>
响应:
HTTP/1.1 207 Multi-Status
Content-Type: application/xml; charset="utf-8"
Content-Length: xxxx
<?xml version="1.0" encoding="utf-8" ?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>http://www.example.com/container/<D:href>
<D:propstat>
<D:prop>
<D:supportedlock>
<D:lockentry>
<D:lockscope><D:exclusive/><D:lockscope>
<D:locktype><D:write/><D:locktype>
<D:lockentry>
<D:lockentry>
<D:lockscope><D:shared/><D:lockscope>
<D:locktype><D:write/><D:locktype>
<D:lockentry>
<D:supportedlock>
<D:prop>
<D:status>HTTP/1.1 200 OK<D:status>
<D:propstat>
<D:response>
<D:multistatus>