15. DAV Properties (DAV 属性)
15. DAV Properties (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 Property (creationdate 属性)
名称 (Name): creationdate
目的 (Purpose): 记录资源创建的时间和日期。
值 (Value): date-time (在 [RFC3339] 中定义, 参见第 5.6 节中的 ABNF。)
受保护 (Protected): 可以受保护。某些服务器允许更改 DAV:creationdate 以反映文档创建的时间, 如果这对用户更有意义 (而不是上传时间)。因此, 客户端不应该在同步逻辑中使用此属性 (改用 DAV:getetag)。
COPY/MOVE 行为: 此属性值应该在 MOVE 操作期间保留, 但在使用 COPY 创建资源时通常会重新初始化。不应在 COPY 中设置它。
描述 (Description): DAV:creationdate 属性应该在所有 DAV 兼容资源上定义。如果存在, 它包含资源创建时刻的时间戳。无法持久记录创建日期的服务器应该将其保留为未定义 (即报告 "Not Found")。
<!ELEMENT creationdate (#PCDATA) >
15.2. displayname Property (displayname 属性)
名称 (Name): displayname
目的 (Purpose): 为资源提供适合向用户展示的名称。
值 (Value): 任何文本。
受保护 (Protected): 不应该受保护。请注意, 实现 [RFC2518] 的服务器可能已将此属性设为受保护属性, 因为这是新要求。
COPY/MOVE 行为: 此属性值应该在 COPY 和 MOVE 操作中保留。
描述 (Description): 包含适合向用户展示的资源描述。此属性在资源上定义, 因此应该具有与用于检索它的 Request-URI 无关的相同值 (因此, 不推荐基于 Request-URI 计算此属性)。虽然通用客户端可能向最终用户显示属性值, 但客户端 UI 设计者必须理解标识资源的方法仍然是 URL。对 DAV:displayname 的更改不会向服务器发出移动或复制操作, 而只是更改单个资源上的一条元数据。即使在同一集合中, 两个资源也可以具有相同的 DAV:displayname 值。
<!ELEMENT displayname (#PCDATA) >
15.3. getcontentlanguage Property (getcontentlanguage 属性)
名称 (Name): getcontentlanguage
目的 (Purpose): 包含 Content-Language 头值 (来自 [RFC2616] 的第 14.12 节), 就像不带 accept 头的 GET 返回的那样。
值 (Value): language-tag (language-tag 在 [RFC2616] 的第 3.10 节中定义)
受保护 (Protected): 不应该受保护, 以便客户端可以重置语言。请注意, 实现 [RFC2518] 的服务器可能已将此属性设为受保护属性, 因为这是新要求。
COPY/MOVE 行为: 此属性值应该在 COPY 和 MOVE 操作中保留。
描述 (Description): DAV:getcontentlanguage 属性必须在任何在 GET 上返回 Content-Language 头的 DAV 兼容资源上定义。
<!ELEMENT getcontentlanguage (#PCDATA) >
15.4. getcontentlength Property (getcontentlength 属性)
名称 (Name): getcontentlength
目的 (Purpose): 包含不带 accept 头的 GET 返回的 Content-Length 头。
值 (Value): 参见 [RFC2616] 的第 14.13 节。
受保护 (Protected): 此属性是计算出来的, 因此受保护。
描述 (Description): DAV:getcontentlength 属性必须在任何响应 GET 返回 Content-Length 头的 DAV 兼容资源上定义。
COPY/MOVE 行为: 此属性值取决于目标资源的大小, 而不是源资源上属性的值。
<!ELEMENT getcontentlength (#PCDATA) >
15.5. getcontenttype Property (getcontenttype 属性)
名称 (Name): getcontenttype
目的 (Purpose): 包含 Content-Type 头值 (来自 [RFC2616] 的第 14.17 节), 就像不带 accept 头的 GET 返回的那样。
值 (Value): media-type (在 [RFC2616] 的第 3.7 节中定义)
受保护 (Protected): 如果服务器更喜欢自己分配内容类型, 则可能受保护 (另请参见第 9.7.1 节中的讨论)。
COPY/MOVE 行为: 此属性值应该在 COPY 和 MOVE 操作中保留。
描述 (Description): 此属性必须在任何响应 GET 返回 Content-Type 头的 DAV 兼容资源上定义。
<!ELEMENT getcontenttype (#PCDATA) >
15.6. getetag Property (getetag 属性)
名称 (Name): getetag
目的 (Purpose): 包含 ETag 头值 (来自 [RFC2616] 的第 14.19 节), 就像不带 accept 头的 GET 返回的那样。
值 (Value): entity-tag (在 [RFC2616] 的第 3.11 节中定义)
受保护 (Protected): 必须受保护, 因为此值由服务器创建和控制。
COPY/MOVE 行为: 此属性值取决于目标资源的最终状态, 而不是源资源上属性的值。另请注意第 8.8 节中的注意事项。
描述 (Description): getetag 属性必须在任何返回 Etag 头的 DAV 兼容资源上定义。有关 ETag 语义的完整定义, 请参阅 RFC 2616 的第 3.11 节, 有关 WebDAV 中 ETag 的讨论, 请参阅第 8.6 节。
<!ELEMENT getetag (#PCDATA) >
15.7. getlastmodified Property (getlastmodified 属性)
名称 (Name): getlastmodified
目的 (Purpose): 包含 Last-Modified 头值 (来自 [RFC2616] 的第 14.29 节), 就像不带 accept 头的 GET 方法返回的那样。
值 (Value): rfc1123-date (在 [RFC2616] 的第 3.3.1 节中定义)
受保护 (Protected): 应该受保护, 因为某些客户端可能依赖该值进行适当的缓存行为, 或依赖此属性链接到的 Last-Modified 头的值。
COPY/MOVE 行为: 此属性值取决于目标资源的最后修改日期, 而不是源资源上属性的值。请注意, 某些服务器实现使用文件系统日期修改值作为 DAV:getlastmodified 值, 这可以在 MOVE 中保留, 即使 HTTP Last-Modified 值应该更改。请注意, 由于 [RFC2616] 要求客户端在提供 ETag 的情况下使用 ETag, 因此实现 ETag 的服务器可以依赖客户端使用比修改日期更好的机制进行离线同步或缓存控制。另请注意第 8.8 节中的注意事项。
描述 (Description): 资源的最后修改日期应该仅反映资源主体 (GET 响应) 的更改。仅属性的更改不应该导致最后修改日期更改, 因为客户端可能依赖最后修改日期来知道何时覆盖现有主体。DAV:getlastmodified 属性必须在任何响应 GET 返回 Last-Modified 头的 DAV 兼容资源上定义。
<!ELEMENT getlastmodified (#PCDATA) >
15.8. lockdiscovery Property (lockdiscovery 属性)
名称 (Name): lockdiscovery
目的 (Purpose): 描述资源上的活动锁
受保护 (Protected): 必须受保护。客户端通过 LOCK 和 UNLOCK 更改锁列表, 而不是通过 PROPPATCH。
COPY/MOVE 行为: 此属性的值取决于目标的锁状态, 而不是源资源的锁。请记住, 锁不会在 MOVE 操作中移动。
描述 (Description): 返回谁拥有锁、他拥有什么类型的锁、超时类型以及超时剩余时间和关联的锁令牌的列表。如果所有者信息被认为是敏感的, 则可以省略。如果没有锁, 但服务器支持锁, 则该属性将存在但包含零个 'activelock' 元素。如果有一个或多个锁, 则资源上的每个锁都会出现一个 'activelock' 元素。此属性相对于写锁不可锁定 (第 7 节)。
<!ELEMENT lockdiscovery (activelock)* >
15.8.1. 示例 - 检索 DAV:lockdiscovery
请求 (Request):
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>
响应 (Response):
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 Property (resourcetype 属性)
名称 (Name): resourcetype
目的 (Purpose): 指定资源的性质。
受保护 (Protected): 应该受保护。资源类型通常通过创建资源的操作 (MKCOL vs PUT) 决定, 而不是通过 PROPPATCH 决定。
COPY/MOVE 行为: 通常资源的 COPY/MOVE 会在目标产生相同类型的资源。
描述 (Description): 必须在所有 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 Property (supportedlock 属性)
名称 (Name): supportedlock
目的 (Purpose): 提供资源支持的锁功能列表。
受保护 (Protected): 必须受保护。服务器 (而非客户端) 确定支持哪些锁机制。
COPY/MOVE 行为: 此属性值取决于目标支持的锁类型, 而不是源资源上属性的值。尝试 COPY 到目标的服务器不应尝试在目标设置此属性。
描述 (Description): 返回可在资源的锁请求中指定的范围和访问类型组合的列表。请注意, 实际内容本身由访问控制控制, 因此服务器不需要提供客户端无权查看的信息。此属性相对于写锁不可锁定 (第 7 节)。
<!ELEMENT supportedlock (lockentry)* >
15.10.1. 示例 - 检索 DAV:supportedlock
请求 (Request):
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>
响应 (Response):
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>