跳到主要内容

7. ABNF 列表扩展: #rule

[RFC5234] 的 ABNF 规则中的一种 #rule 扩展, 用于提升某些头部字段值定义的可读性.

定义了一种类似 * 的 "#" 构造, 用于定义以逗号分隔的元素列表. 完整形式是 "#element", 表示至少有 个、至多有 个元素, 每个元素之间以单个逗号 (",") 和可选空白 (OWS) 分隔.

在任何使用该列表构造的产生式中, 发送方 MUST NOT 生成空的列表元素. 换言之, 发送方 MUST 生成满足以下语法的列表:

1#element => element *( OWS "," OWS element )

以及:

#element => [ 1#element ]

并且对于 n >= 1 且 m > 1:

<n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )

为了与遗留的列表规则兼容, 接收方 MUST 解析并忽略合理数量的空列表元素: 其数量要足以处理发送方合并值时造成的常见错误, 但又不能大到可被用作拒绝服务机制. 换言之, 接收方 MUST 接受满足以下语法的列表:

#element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ]

1#element => *( "," OWS ) element *( OWS "," [ OWS element ] )

空元素不计入现有元素的数量. 例如, 给定以下 ABNF 产生式:

example-list      = 1#example-list-elmt
example-list-elmt = token ; see Section 3.2.6

那么下列各值都是 example-list 的合法取值 (不包括双引号, 它们只是为了界定而存在):

"foo,bar"
"foo ,bar,"
"foo , ,bar,charlie "

相反, 下列各值是无效的, 因为 example-list 产生式要求至少有一个非空元素:

""
","
", ,"

附录 B 给出了展开列表构造之后供接收方使用的完整 ABNF.