如何解析HTTP头字段?

如何解析HTTP头字段?,http,abnf,Http,Abnf,我正试图根据中指定的ABNF规则头字段解析HTTP头字段。这些规则是: header-field = field-name ":" OWS field-value OWS field-name = token field-value = *( field-content / obs-fold ) field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] field-vchar = VCHAR / obs-t

我正试图根据中指定的ABNF规则
头字段
解析HTTP头字段。这些规则是:

header-field   = field-name ":" OWS field-value OWS

field-name     = token
field-value    = *( field-content / obs-fold )
field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
field-vchar    = VCHAR / obs-text

obs-fold       = CRLF 1*( SP / HTAB )
               ; obsolete line folding
               ; see Section 3.2.4
obs text
只是高位字节0x80到0xff)

我面临的问题是,当应用chrome在响应模式下设置的用户代理字符串时,
标题字段
规则似乎失败:

User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Mobile Safari/537.36
问题源于单独的“5”:当解析器到达“Nexus”中的最后一个“s”时,它同时占用“s”、下面的空格和“5”。这将使解析光标直接位于后面的空格处。就是

   Parsed:    ______________]
   Data:      ...6.0; Nexus 5 Build/MRA58N...
   Cursor:                   ^
由于
feild content
不提供前导空格,因此该规则无法与整个头字段匹配,从而导致解析器无法解析消息的其余部分

很明显,HTTP头应该能够包含由空格包围的单个字符。然而,根据我对规范的阅读,这似乎是不允许的


我在网上搜索过,但没有找到任何相关信息。所以我认为这是我的错误。我的错在哪里?该规则实际上应该如何解释?

对于RFC,您可以在首页上找到勘误表:

关于本文件当前状态的信息,任何勘误表, 关于如何提供反馈,请访问


这可能是-请参阅以了解更多信息。

结果表明,RFC中的ABNF规则不足以表示http标头字段在实践中可以保存的所有值(即RFC是“错误的”)。谢谢你给我指点勘误表。不客气。更有趣的是,即将发布的修订版中的补丁是否适合您。请参阅。我不确定我是否有资格对此问题发表评论,但我认为在
字段内容
开头添加
OWS
可能是更好的解决方案,因为将其添加到
obs fold
对我来说意味着任何包含单个字符的标题都应归类为obs。