Appendices
A.1. Link Serialisation in HTML (HTML中的链接序列化)
HTML [W3C.REC-html5-20141028]定义了<link>元素用于传达链接.例如:
`<link rel="stylesheet" href="/style.css" type="text/css">`
HTML链接与本规范中定义的链接模型之间的对应关系如下:
- 链接上下文是包含链接元素的文档的URI
- 链接关系类型由"rel"属性的值标识
- 链接目标由"href"属性的值标识
- 目标属性由其他属性(如"type","media"等)表示
A.2. Link Serialisation in Atom (Atom中的链接序列化)
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头字段的算法.这些算法是规范性的.
B.1. Parsing a Header Set for Links (解析头集合以获取链接)
给定一组HTTP头字段headers:
- 让links为空列表
- 对于headers中的每个字段field,其字段名为"Link"(不区分大小写):
- 让field_value为field的字段值
- 让field_links为解析field_value的结果(使用B.2节中的算法)
- 将field_links中的每个链接添加到links
- 返回links
B.2. Parsing a Link Field Value (解析Link字段值)
该算法从一个 Link 头字段值中解析零个或多个以逗号分隔的 link-value. 给定 ASCII 字符串 field_value, 返回 link object 列表:
- 令
links为空列表. - 当
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匹配rel或anchor, 跳过该元组. - 如果
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.
- 将
- 返回
links.
B.3. Parsing Parameters (解析参数)
该算法从头字段值中解析参数. 给定 ASCII 字符串 input, 返回其中包含的 (parameter_name, parameter_value) 元组列表, 并从 input 中移除已经解析的字符:
- 令
parameters为空列表. - 当
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 中移除已解析字符:
- 令
output为空字符串. - 如果
input的第一个字符不是 DQUOTE, 返回output. - 丢弃第一个字符.
- 当
input仍有内容时:- 如果第一个字符是反斜杠
\, 丢弃该字符. 如果没有更多输入, 返回output; 否则消耗第一个字符并追加到output. - 否则, 如果第一个字符是 DQUOTE, 丢弃该字符并返回
output. - 否则, 消耗第一个字符并追加到
output.
- 如果第一个字符是反斜杠
- 返回
output.
Appendix C. Changes from RFC 5988 (与RFC 5988的变化)
本规范与RFC 5988相比的主要变化包括:
- 澄清了链接上下文和链接目标的定义
- 更新了注册程序以使用RFC 8126
- 添加了解析算法(附录B)
- 澄清了扩展关系类型的使用
- 更新了对其他规范的引用
- 改进了示例和说明文本