如何在 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-Type
和 Transfer-Encoding
header 告诉您如何解释消息数据。
在您的特定示例中,在读取 header 之后,根据第 4.4 节,您将检索 Content-Length
header 的值,然后准确读取 131 个字节,停止阅读,并由于 Connection: close
header 而关闭套接字。然后您将检索 Content-Type
header 的值并知道数据是 UTF-8 编码的 HTML 并相应地处理它。
请参阅我在较早的回答中发布的pseudo-code:
今天我想问如何从我的 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-Type
和 Transfer-Encoding
header 告诉您如何解释消息数据。
在您的特定示例中,在读取 header 之后,根据第 4.4 节,您将检索 Content-Length
header 的值,然后准确读取 131 个字节,停止阅读,并由于 Connection: close
header 而关闭套接字。然后您将检索 Content-Type
header 的值并知道数据是 UTF-8 编码的 HTML 并相应地处理它。
请参阅我在较早的回答中发布的pseudo-code: