如何在 C 中从 HTTP header 中提取数据?

How to extract data from HTTP header in C?

今天我想问如何从我的 recv() 中的接收缓冲区中提取数据部分(不是 C++)。

我只是需要一些建议,我该如何获得

HTTP/1.1 200 OK\r\n
Date: Mon, 23 May 2005 22:38:34 GMT\r\n
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)\r\n
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\r\n
ETag: "3f80f-1b6-3e1cb03b"\r\n
Content-Type: text/html; charset=UTF-8\r\n
Content-Length: 131\r\n
Connection: close\r\n
\r\n

<html>
<head>
<title>An Example Page</title>
</head>
<body>
  Hello World, this is a very simple HTML document.
</body>
</html>

上面的部分header?它存储在我的缓冲区中,我特别只想剖析数据(页面的源代码)。有什么想法吗?

header 以 \r\n\r\n 结束。如果整个响应都在接收缓冲区中并且你在响应的末尾放置了一个'[=12=]',那么你可以使用以下代码找到数据部分的开始

char *data = strstr( buffer, "\r\n\r\n" );
if ( data != NULL )
{ 
    data += 4;
    // do something with the data
}

您需要实际解析数据,才能知道 header 的结束位置和消息数据的开始位置,以及消息数据的结束位置。 header 以 \r\n\r\n (CRLF+CRLF, 0x0D 0x0A 0x0D 0x0A) 字节序列结尾。所以你必须继续阅读,直到遇到那个终结者。然后您必须解析 header 以了解消息的其余部分是如何 编码的 以及它是如何 终止的 。规则参考RFC 2616 Section 4.4 Message Length。这将告诉您 HOW 读取剩余数据并 WHEN 停止读取它。数据可能被分块或压缩或 self-terminating。 Content-TypeTransfer-Encoding header 告诉您如何解释消息数据。

在您的特定示例中,在读取 header 之后,根据第 4.4 节,您将检索 Content-Length header 的值,然后准确读取 131 个字节,停止阅读,并由于 Connection: close header 而关闭套接字。然后您将检索 Content-Type header 的值并知道数据是 UTF-8 编码的 HTML 并相应地处理它。

请参阅我在较早的回答中发布的pseudo-code:

Receiving Chunked HTTP Data With Winsock