解析HTTP头部字段值的每个部分

5

我正在直接从数据包中解析HTTP数据(无论是TCP重构还是非重构,您可以假设它是重构的)。

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

主要问题在于HTTP头部。

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

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

到目前为止,我已经编写了用于通用HTTP头部的基本解析:

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

我已经包含了在第4.2节中描述的用SP替换内部LWS和使用逗号分隔值重复具有相同field-name的标头。

然而,查看第14.9节会发现为了解析field-value的不同部分,我需要一个更复杂的解析方案。

如果我想要给解析器用户HTTP的全部功能并解析HTTP的每个部分,你建议我如何处理HTTP解析的复杂部分(特别是field-value)?

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

谢谢。

2个回答

9
我会遵循单一职责原则。不要试图创建一个知道人类所知道的每个HTTP头部细节的单一庞大解析器,而是要更简单。编写一个简单的可扩展解析器,它本身只负责处理解析字段名称并将该名称与原始值关联。然后利用可插拔的扩展,这些扩展只负责解析单个类型的标头。当您创建解析器实例时,注入一组扩展,并将每个扩展映射到它知道如何解析的字段名称集。
这种方法可以一举两得。您的核心解析器保持简单和有针对性。您还可以扩展解析器,而无需深入其内部,从而获得更健壮的代码。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接