我想知道,是否有可能找出响应流中标头结束的位置?
问题的背景如下,我在c中使用套接字从网站获取内容,内容以gzip编码。我想直接从流中读取内容并使用 zlib 对 gzip 内容进行编码。但是我怎么知道 gzip 内容开始并且 http 标头完成了。
我粗略地尝试了两种方法,在我看来,它们给了我一些奇怪的结果。首先,我读入整个流,并在终端中打印出来,我的 http 标头以“\r\n\r\n”结尾,就像我预期的那样,但是第二次,我只检索一次响应以获取标头然后使用 while 循环读取内容,此处标题以没有“\r\n\r\n”结尾。
为什么?哪种方式是阅读内容的正确方式?
我只会给你代码,这样你就可以看到我是如何从服务器获得响应的。
//first way (gives rnrn)
char *output, *output_header, *output_content, **output_result;
size_t size;
FILE *stream;
stream = open_memstream (&output, &size);
char BUF[BUFSIZ];
while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
fprintf (stream, "%s", BUF);
}
fflush(stream);
fclose(stream);
output_result = str_split(output, "\r\n\r\n");
output_header = output_result[0];
output_content = output_result[1];
printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", output_content);
.
//second way (doesnt give rnrn)
char *content, *output_header;
size_t size;
FILE *stream;
stream = open_memstream (&content, &size);
char BUF[BUFSIZ];
if((recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
output_header = BUF;
}
while(recv(socket_desc, BUF, (BUFSIZ - 1), 0) > 0)
{
fprintf (stream, "%s", BUF); //i would just use this as input stream to zlib
}
fflush(stream);
fclose(stream);
printf("Header:\n%s\n", output_header);
printf("Content:\n%s\n", content);
两者都给出相同的结果,将它们打印到终端,但第二个应该打印出更多的中断,至少我期望,因为它们在拆分字符串时会丢失。
我是c新手,所以我可能只是监督一些简单的东西。