5

我直接从数据包中解析 HTTP 数据(无论 TCP 是否重建,你都可以假设它是)。

我正在寻找尽可能准确地解析 HTTP 的最佳方法。

这里的主要问题是 HTTP 标头。

查看HTTP/1.1 的基本 RFC,似乎 HTTP 标头解析会很复杂。RFC 为标头的不同部分描述了非常复杂的正则表达式。

我应该编写这些正则表达式来解析 HTTP 标头的不同部分吗?

到目前为止,我为 HTTP 标头编写的基本解析是针对通用 HTTP 标头的:

message-header = field-name ":" [ field-value ]

并且我已经包括用逗号分隔值替换内部LWSSP重复标题,field-name如第 4.2 节所述。

但是,例如查看第 14.9 节会表明,为了解析 I 的不同部分,field-value我需要一个更复杂的解析方案。

field-value假设我想为解析器用户提供 HTTP 的全部功能并解析 HTTP 的每个部分,您如何建议我应该处理 HTTP 解析的复杂部分(特别是)?

对此的设计建议也将不胜感激。

谢谢。

4

2 回答 2

9

我会遵循单一责任原则。与其尝试创建一个单一的整体解析器,它知道人类已知的每个 HTTP 标头的每个细节,不如更简单。编写一个简单的可扩展解析器,它本身只负责处理解析字段名称并将该名称与原始值相关联。然后使用只负责解析一种头的可插入扩展。当您创建解析器的实例时,注入一组扩展,并将每个扩展映射到一组它知道如何解析的字段名称。

你用这种方法用一块石头杀死两只鸟。您的核心解析器仍然简单且有针对性。您还可以获得扩展解析器的能力,而不必弄乱它的胆量,从而产生更健壮的代码。

于 2010-06-13T05:58:14.660 回答
1

命名空间中有一堆解析器System.Net.Http.Headers。值得一看。

于 2015-10-07T20:29:09.597 回答