应该如何解析HTTP标头字段?

时间:2019-07-02 06:51:25

标签: http abnf

我正在尝试根据the relevant section of RFC 7230中指定的ABNF规则header-field解析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在响应模式下设置的用户代理字符串时,header-field规则似乎失败了:

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头应该能够包含被空格包围的单个字符。但是,根据我对规范的阅读,这似乎是不允许的。

我已经在线搜索了,但没有找到任何相关信息。因此,我认为这是我的错。我的错误在哪里?以及该规则应如何实际解释?

1 个答案:

答案 0 :(得分:1)

对于RFC,您可以按照首页上的指示找到勘误表:

  

有关本文档当前状态的信息,任何勘误,   有关如何提供反馈的信息,请访问
  http://www.rfc-editor.org/info/rfc7230

这个可能是https://www.rfc-editor.org/errata/eid4189-有关更多信息,请参见https://github.com/httpwg/http-core/issues/19