gpt4 book ai didi

c++ - 如何正确解析传入的 HTTP 请求

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:56 33 4
gpt4 key购买 nike

我已经使用 WinSck 创建了一个 C++ 应用程序,它实现了一个小型(仅处理我需要的一些功能)http 服务器。这用于使用 http 请求与外界通信。它可以工作,但有时请求没有得到正确处理,因为解析失败。现在我很确定请求的格式正确,因为它们是由主要的网络浏览器发送的,例如 firefox/chrome 或 perl/C#(具有 http 模块/dll)。

经过一些调试,我发现问题实际上是在接收消息上。当消息不止一个部分出现时(它不是在一次 recv() 调用中读取的),有时解析会失败。我已经多次尝试解决这个问题,但似乎没有什么是足够可靠的。

我现在做的是读入数据,直到找到 "\r\n\r\n" 指示 header 结束的序列。如果 WSAGetLastError() 在发现这样的序列之前报告了 10035 之外的其他内容(连接关闭/失败),我将丢弃该消息。当我知道我有整个标题时,我会解析它并查找有关正文长度的信息。但是我不确定这个信息是否是强制性的(我认为不是),如果没有这样的信息我该怎么办 - 这是否意味着没有尸体?另一个问题是我不知道是否应该在正文之后寻找 "\r\n\r\n"(如果它的长度大于零)。

有人知道如何可靠地解析 http 消息吗?

注意:我知道那里有 http 服务器的实现。由于各种原因,我想要自己的。是的,重新发明轮子是不好的,我也知道这一点。

最佳答案

如果您打算编写自己的解析器,我会选择 Zed Shaw方法:使用Ragel状态机编译器并基于它构建你的解析器。如果你小心的话,Ragel 可以处理成 block 的输入。

不过,老实说,我只会使用 something like this .

您的首选资源应该是 RFC 2616 ,它描述了 HTTP 1.1,您可以使用它来构建解析器。祝你好运!

关于c++ - 如何正确解析传入的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3698402/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com