如何使用libcurl解析HTTP头?

13

我一直在寻找一种通用的方式来解析libcurl中的头文件(目前似乎是HTTP的C语言标准库),但很惊讶地发现似乎没有这样的方法。

我找到的最接近的方法是一个邮件列表,其中有人建议别人搜索邮件列表存档。

libcurl提供的唯一功能是通过setopt设置的CURLOPT_HEADERFUNCTION,它会一次传递一行响应头。

考虑到头可以跨越多行,这种方法看起来过于简单了。理论上应该只需要正确地执行一次(最好由库本身完成),而不是一直要求应用程序开发人员去重新发明轮子。

编辑

一个天真的例子无法工作,请参见以下gist,其中包含libcurl代码示例和无法解析的正确格式的http响应:https://gist.github.com/762954


我完全明白你的意思。不幸的是,即使没有提供CURLOPT_HEADERFUNCTION并且将CURLOPT_HEADER设置为true,libcurl似乎也会对头行进行一些处理。也就是说,它正在进行相当无用的词法分析。 - jberryman
2个回答

14

已经过去一年了,所以我想将其手动关闭。

如果你遇到了cURL问题,我为你感到难过,

因为你有多行头文件,必须解析每一行。


7
libcurl是一个开源项目。这意味着它依赖于志愿者的贡献。你也可以成为其中之一! - Daniel Stenberg

10

libcurl会读取每个HTTP头并将其作为单独的完整行发送到标头回调

"续行" HTTP 头不允许在 HTTP 1.1 RFC 7230 系列中出现,即使在此之前它们也几乎已经消失了,但它们也会发送到回调函数。

Header API

自 libcurl 7.84.0 以来,它提供了一个易于使用的API,以访问以前传输的所有和任何响应头。请参见curl_easy_header以访问特定响应头,或者如果您想迭代它们,请使用curl_easy_nextheader

头 API 支持 "续行" 行,并且无论响应使用哪个 HTTP 版本,它都可以正常工作。


4
多行标题可能不常见,但是它是有效的,如果应用程序遇到这种情况,我宁愿不要让它完全崩溃。 - Dustin
1
它们在HTTPbis中是不被允许的,而这是HTTP规范的即将更新... 在我看来,今天添加对它们的支持似乎完全没有意义。但如果那是你的目的,请随意前进。 - Daniel Stenberg
“libcurl读取整个头并将其作为单个完整行发送到回调函数。”这不正确,因为据我所知,libcurl似乎会逐行(包括换行符和最后的\r\n)向回调函数发送数据,直到达到正文部分。正如@Dustin指出的那样,如果您无法完全控制客户端获取响应的服务器,则此方法相当无用。 - jberryman
他指出的不是那个。他指出它不能处理多行标题。许多应用程序在没有对服务器拥有“完全控制”的情况下以这种方式解析HTTP标头。 - Daniel Stenberg

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