解析 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 标头字段值的每个部分的主要内容,如果未能解决你的问题,请参考以下文章

HTTP报文头解析

分部类和分部方法

HTTP 首部字段详细介绍

重温IPsec隧道❤️

重温IPsec隧道❤️

HTTP权威指南之HTTP事务