7. ABNF-Listenerweiterung: #rule
Eine #rule-Erweiterung der ABNF-Regeln von [RFC5234] wird verwendet, um die Lesbarkeit in den Definitionen einiger Header-Feldwerte zu verbessern.
Ein Konstrukt "#" ist definiert, ähnlich wie "*", zum Definieren durch Kommas begrenzter Listen von Elementen. Die vollständige Form ist "
In jeder Produktion, die das Listenkonstrukt verwendet, darf ein Absender KEINE leeren Listenelemente erzeugen. Mit anderen Worten, ein Absender MUSS Listen erzeugen, die die folgende Syntax erfüllen:
1#element => element *( OWS "," OWS element )
und:
#element => [ 1#element ]
und für n >= 1 und m > 1:
<n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )
Zur Kompatibilität mit alten Listenregeln muss ein Empfänger eine angemessene Anzahl leerer Listenelemente parsen und ignorieren: genug, um gängige Fehler von Absendern zu behandeln, die Werte zusammenfassen, aber nicht so viel, dass sie als Denial-of-Service-Mechanismus verwendet werden könnten. Mit anderen Worten, ein Empfänger MUSS Listen akzeptieren, die die folgende Syntax erfüllen:
#element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ]
1#element => *( "," OWS ) element *( OWS "," [ OWS element ] )
Leere Elemente tragen nicht zur Anzahl der vorhandenen Elemente bei. Beispielsweise sind mit diesen ABNF-Produktionen:
example-list = 1#example-list-elmt
example-list-elmt = token ; see Section 3.2.6
die folgenden Werte gültige Werte für example-list (ohne die doppelten Anführungszeichen, die nur zur Abgrenzung vorhanden sind):
"foo,bar"
"foo ,bar,"
"foo , ,bar,charlie "
Im Gegensatz dazu wären die folgenden Werte ungültig, da die Produktion example-list mindestens ein nicht leeres Element erfordert:
""
","
", ,"
Anhang B zeigt die gesammelte ABNF für Empfänger, nachdem die Listenkonstrukte expandiert wurden.