7. ABNF 列表扩展: #rule
[RFC5234] 的 ABNF 规则中的一种 #rule 扩展, 用于提升某些头部字段值定义的可读性.
定义了一种类似 * 的 "#" 构造, 用于定义以逗号分隔的元素列表. 完整形式是 "
在任何使用该列表构造的产生式中, 发送方 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.