解析 HTTP 标头字段值的每个部分
Posted
技术标签:
【中文标题】解析 HTTP 标头字段值的每个部分【英文标题】:Parsing every part of an HTTP header field-value 【发布时间】:2010-06-13 05:40:46 【问题描述】:我直接从数据包中解析 HTTP 数据(TCP 重构与否,你可以假设它是)。
我正在寻找尽可能准确地解析 HTTP 的最佳方法。
这里的主要问题是 HTTP 标头。
看基本的RFC of HTTP/1.1,好像HTTP头解析会很复杂。 RFC 为标头的不同部分描述了非常复杂的正则表达式。
我应该编写这些正则表达式来解析 HTTP 标头的不同部分吗?
到目前为止,我为 HTTP 标头编写的基本解析是针对通用 HTTP 标头:
message-header = field-name ":" [ field-value ]
我已经将内部 LWS
替换为 SP
并使用相同的 field-name
以逗号分隔值重复标题,如第 4.2 节所述。
但是,例如查看第 14.9 节会表明,为了解析 field-value
的不同部分,我需要一个更复杂的解析方案。
假设我想为解析器用户提供 HTTP 的全部功能并解析 HTTP 的每个部分,你建议我应该如何处理 HTTP 解析的复杂部分(特别是 field-value
)?
对此的设计建议也将不胜感激。
谢谢。
【问题讨论】:
【参考方案1】:我会遵循单一职责原则。与其尝试创建一个单一的整体解析器,它知道人类已知的每个 HTTP 标头的每个细节,不如更简单。编写一个简单的可扩展解析器,它本身只负责处理解析字段名称并将该名称与原始值相关联。然后使用只负责解析一种头文件的可插入扩展。当您创建解析器的实例时,注入一组扩展,并将每个扩展映射到一组它知道如何解析的字段名称。
你用这种方法用一块石头杀死两只鸟。您的核心解析器仍然简单且有针对性。您还可以获得扩展解析器的能力,而不必弄乱它的胆量,从而产生更健壮的代码。
【讨论】:
【参考方案2】:System.Net.Http.Headers
命名空间中有很多解析器。值得一看。
【讨论】:
以上是关于解析 HTTP 标头字段值的每个部分的主要内容,如果未能解决你的问题,请参考以下文章