我构建了一个解析标题的程序,我希望在收到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
答案 0 :(得分:3)
有几件事需要考虑。您可能想要考虑如何处理所有这些情况?
对于HTTP协议1.0,连接关闭用于表示数据结束。
这在HTTP 1.1中有所改进,它支持持久连接。对于HTTP 1.1,通常设置或读取Content-Length标头以了解预期的数据量。
最后,对于HTTP 1.1,还有“Chunked”模式的可能性,你可以得到它们的大小,你知道当找到一个块大小== 0时你已经到了最后。
你也知道libcurl吗?它肯定会帮助你重新实现轮子。
答案 1 :(得分:0)
此代码阻塞read(),等待另一个永远不会来的字符。
此外,RFC2616, 3。7.1声明“HTTP应用程序必须接受CRLF,裸CR和裸LF,以表示通过HTTP接收的文本媒体中的换行符。此外,如果文本表示为对于CR和LF分别不使用八位字节13和10的字符集,就像某些多字节字符集的情况一样,HTTP允许使用该字符集定义的任何八位字节序列来表示CR和LF的等价物换行。“
所以你需要捕获的不只是“\ n”。