跳到主要内容

Appendices

HTML [W3C.REC-html5-20141028]定义了<link>元素用于传达链接.例如:

`<link rel="stylesheet" href="/style.css" type="text/css">`

HTML链接与本规范中定义的链接模型之间的对应关系如下:

  • 链接上下文是包含链接元素的文档的URI
  • 链接关系类型由"rel"属性的值标识
  • 链接目标由"href"属性的值标识
  • 目标属性由其他属性(如"type","media"等)表示

Atom [RFC4287]定义了一个链接元素,可以出现在feed和entry中.例如:

<link rel="alternate" type="text/html" 
href="http://example.org/"/>

Atom链接与本规范中定义的链接模型之间的对应关系如下:

  • 链接上下文是包含链接元素的feed或entry的URI
  • 链接关系类型由"rel"属性的值标识
  • 链接目标由"href"属性的值标识
  • 目标属性由其他属性(如"type","hreflang"等)表示

Appendix B. Algorithms for Parsing Link Header Fields (解析Link头字段的算法)

本附录定义了解析Link头字段的算法.这些算法是规范性的.

给定一组HTTP头字段headers:

  1. 让links为空列表
  2. 对于headers中的每个字段field,其字段名为"Link"(不区分大小写):
    • 让field_value为field的字段值
    • 让field_links为解析field_value的结果(使用B.2节中的算法)
    • 将field_links中的每个链接添加到links
  3. 返回links

该算法从一个 Link 头字段值中解析零个或多个以逗号分隔的 link-value. 给定 ASCII 字符串 field_value, 返回 link object 列表:

  1. links 为空列表.
  2. field_value 仍有内容时:
    • 消耗任何前导 OWS.
    • 如果第一个字符不是 <, 返回 links.
    • 丢弃 <.
    • 消耗直到第一个 > 之前或输入结束的内容, 并令结果为 target_string.
    • 如果下一个字符不是 >, 返回 links.
    • 丢弃 >.
    • link_parameters 为对剩余 field_value 执行 B.3 节参数解析的结果.
    • 按 [RFC3986] 第 5.2 节相对解析 target_string, 得到 target_uri. 注意, 负载正文中的任何 base URI 都不使用.
    • link_parameters 中取第一个名称匹配 rel 的元组的第二项作为 relations_string; 如果不存在, 则使用空字符串.
    • 按 RWS 分割 relations_string, 得到 relation_types 列表.
    • link_parameters 中取第一个名称匹配 anchor 的元组的第二项作为 context_string; 如果不存在, 则使用承载 Link 头字段的表示的 URL, 并序列化为 URI. 如果该 URL 是 anonymous, 则 context_string 为 null.
    • 除非 context_string 为 null, 否则按 [RFC3986] 第 5.2 节相对解析 context_string, 得到 context_uri. 负载正文中的 base URI 同样不使用.
    • target_attributes 为空列表.
    • link_parameters 中每个 (param_name, param_value):
      • 如果 param_name 匹配 relanchor, 跳过该元组.
      • 如果 param_name 匹配 media, title, title*type, 且 target_attributes 已有同名元组, 跳过该元组.
      • 否则将 (param_name, param_value) 添加到 target_attributes.
    • 找出所有以星号 * 结尾的参数名, 形成 star_param_names.
    • 对每个 star_param_name:
      • base_param_name 为去掉末尾 * 后的名称.
      • 如果实现不支持该参数的国际化形式, 从 link_parameters 中移除所有名称为 star_param_name 的元组, 并处理下一个星号参数.
      • link_parameters 中移除所有名称为 base_param_name 的元组.
      • 将所有名称为 star_param_name 的元组名称改为 base_param_name.
    • 对每个 relation_type:
      • relation_type 规范化为小写.
      • links 添加一个 link object, 其 target 为 target_uri, relation type 为 relation_type, context 为 context_uri, target attributes 为 target_attributes.
  3. 返回 links.

B.3. Parsing Parameters (解析参数)

该算法从头字段值中解析参数. 给定 ASCII 字符串 input, 返回其中包含的 (parameter_name, parameter_value) 元组列表, 并从 input 中移除已经解析的字符:

  1. parameters 为空列表.
  2. input 仍有内容时:
    • 消耗任何前导 OWS.
    • 如果第一个字符不是 ;, 返回 parameters.
    • 丢弃前导 ;.
    • 消耗任何前导 OWS.
    • 消耗直到第一个 BWS、=;, 或输入结束之前的内容, 并令结果为 parameter_name.
    • 消耗任何前导 BWS.
    • 如果下一个字符是 =:
      • 丢弃 =.
      • 消耗任何前导 BWS.
      • 如果下一个字符是 DQUOTE, 令 parameter_value 为按 B.4 节解析 quoted string 的结果.
      • 否则, 消耗直到第一个 ;, 或输入结束之前的内容, 并令结果为 parameter_value.
      • 如果 parameter_name 的最后一个字符是 *, 按 [RFC8187] 解码 parameter_value. 如果遇到不可恢复错误, 继续处理后续输入.
    • 否则, 令 parameter_value 为空字符串.
    • parameter_name 规范化为小写.
    • (parameter_name, parameter_value) 添加到 parameters.
    • 消耗任何前导 OWS.
    • 如果下一个字符是 , 或输入已经结束, 停止处理并返回 parameters.

B.4. Parsing a Quoted String (解析带引号的字符串)

该算法按 [RFC7230] 第 3.2.6 节解析 quoted string. 给定 ASCII 字符串 input, 返回去引号后的字符串, 并从 input 中移除已解析字符:

  1. output 为空字符串.
  2. 如果 input 的第一个字符不是 DQUOTE, 返回 output.
  3. 丢弃第一个字符.
  4. input 仍有内容时:
    • 如果第一个字符是反斜杠 \, 丢弃该字符. 如果没有更多输入, 返回 output; 否则消耗第一个字符并追加到 output.
    • 否则, 如果第一个字符是 DQUOTE, 丢弃该字符并返回 output.
    • 否则, 消耗第一个字符并追加到 output.
  5. 返回 output.

Appendix C. Changes from RFC 5988 (与RFC 5988的变化)

本规范与RFC 5988相比的主要变化包括:

  • 澄清了链接上下文和链接目标的定义
  • 更新了注册程序以使用RFC 8126
  • 添加了解析算法(附录B)
  • 澄清了扩展关系类型的使用
  • 更新了对其他规范的引用
  • 改进了示例和说明文本