HTTP协议:消息体的结尾

我构建了一个解析标题的程序,我希望在收到POST时读取消息正文。

对于标题,我已经能够查找以确定标题何时结束。 我对邮件正文有更多问题。 我是否应该查看“内容长度”字段以了解何时停止阅读输入? 在我当前的代码(下面)中,它不会停止,直到我在Firefox中遇到红叉(停止加载页面)。

这是代码:

size_t n; unsigned char newChar; int index = 0; int capacity = 50; char *option = (char *) malloc(sizeof(char) * capacity); while ( ( n = read( req->socket, &newChar, sizeof(newChar) ) ) > 0 ) { if (newChar == '\0' || newChar == '\n') break; // This is not working if (index == capacity) { capacity *= 2; option = (char *) realloc(option, sizeof(char) * capacity); assert(option != NULL); } option[index++] = newChar; fprintf(stderr, "%c", newChar); } if (index == capacity) { capacity *= 2; option = (char *) realloc(option, sizeof(char) * capacity); assert(option != NULL); } option[index] = '\0'; 

打印正确的输入,但我想知道为什么它不会停止,直到按下停止加载按钮。 我想知道是否有其他解决方案,或者我是否需要使用标题中的“Content-Length”字段。

非常感谢你,

Jary

有几点需要考虑。 您可能想要考虑如何处理所有这些情况?

  • 对于HTTP协议1.0,连接关闭用于表示数据的结束。

  • 这在HTTP 1.1中得到了改进,它支持持久连接。 对于HTTP 1.1,通常设置或读取Content-Length标头以了解预期的数据量。

  • 最后使用HTTP 1.1还有“Chunked”模式的可能性,你可以得到它们的大小,你知道在找到块大小== 0时你已经到了最后。

你也知道libcurl吗? 它肯定会帮助你重新实现轮子。

这段代码阻塞了read(),等待另一个永远不会来的字符。

此外,RFC2616,3.7.1规定“HTTP应用程序必须接受CRLF,裸CR和裸LF,以表示通过HTTP接收的文本媒体中的换行符。此外,如果文本以不包含的字符集表示对于CR和LF分别使用八位字节13和10,就像某些多字节字符集的情况一样,HTTP允许使用该字符集定义的任何八位字节序列来表示换行符的CR和LF的等价物。

因此,您需要捕获的不仅仅是“\ n”。