我正在尝试基于SPF RFC7208实现check_host函数。一切就绪,剩下的就是第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 = "." / "-" / "+" / "," / "/" / "_" / "="
我认为将domain-spec应用于www.example.com将遵循以下路径:domain-spec-> macro-string-> macro-literal(重复),这将占用整个字符串,然后耗尽domain-end永远不会匹配。
我在哪里错了?
编辑1:
我想我得到了答案,原来的问题更像是一个确认请求。 ABNF中的重复是贪婪的,但可能允许退缩-即,如果这会导致匹配,则少吃点东西。纵观RFC5234(https://tools.ietf.org/html/rfc5234),虽然不是全部,但我无法确定这一点。谁能确认?