Я пытаюсь реализовать функцию check_host на основе SPF RFC7208.Он почти готов, и осталось только раскрытие макроса, подробно описанное в разделе 7 (https://tools.ietf.org/html/rfc7208#section-7).). Я знаю, что есть готовые решения для этого, но ради примера или практики я хочу реализовать свой собственный алгоритм.При этом у меня проблема в том, что www.example.com не соответствует описанию ABNF. Я предполагаю, что это из-за моих неправильных рассуждений, и именно поэтому я прошу помощи.
Это ABNFскопировано из документа:
domain-spec = macro-string domain-end
domain-end = ( "." toplabel [ "." ] ) / macro-expand
toplabel = ( *alphanum ALPHA *alphanum ) /
( 1*alphanum "-" *( alphanum / "-" ) alphanum )
alphanum = ALPHA / DIGIT
explain-string = *( macro-string / SP )
macro-string = *( macro-expand / macro-literal )
macro-expand = ( "%{" macro-letter transformers *delimiter "}" )
/ "%%" / "%_" / "%-"
macro-literal = %x21-24 / %x26-7E
; visible characters except "%"
macro-letter = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
"c" / "r" / "t" / "v"
transformers = *DIGIT [ "r" ]
delimiter = "." / "-" / "+" / "," / "/" / "_" / "="
Я думаю, что применение спецификации домена к www.example.com будет идти по этому пути: спецификация домена -> строка макроса -> макро-литерал (повторяется), и этопоглотит всю строку, а затем конец домена никогда не совпадет.
Где я ошибаюсь?
Редактировать 1:
Я думаю, что получил ответ и оригиналвопрос становится больше похожим на запрос подтверждения. Повторение в ABNF является жадным, но, вероятно, позволяет отстать - т.е. есть меньше, если это приведет к совпадению. Глядя на RFC5234 (https://tools.ietf.org/html/rfc5234), thoтьфу не в полном объеме, я не смог определенно заметить это.Кто-нибудь может подтвердить?