Skip to main content

7. ABNF List Extension: #rule

A #rule extension to the ABNF rules of [RFC5234] is used to improve readability in the definitions of some header field values.

A construct "#" is defined, similar to "*", for defining comma-delimited lists of elements. The full form is "#element" indicating at least and at most elements, each separated by a single comma (",") and optional whitespace (OWS).

In any production that uses the list construct, a sender MUST NOT generate empty list elements. In other words, a sender MUST generate lists that satisfy the following syntax:

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

and:

#element => [ 1#element ]

and for n >= 1 and m > 1:

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

For compatibility with legacy list rules, a recipient MUST parse and ignore a reasonable number of empty list elements: enough to handle common mistakes by senders that merge values, but not so much that they could be used as a denial-of-service mechanism. In other words, a recipient MUST accept lists that satisfy the following syntax:

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

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

Empty elements do not contribute to the count of elements present. For example, given these ABNF productions:

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

Then the following are valid values for example-list (not including the double quotes, which are present for delimitation only):

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

In contrast, the following values would be invalid, since at least one non-empty element is required by the example-list production:

""
","
", ,"

Appendix B shows the collected ABNF for recipients after the list constructs have been expanded.