HTTP协议:消息体的结尾

时间:2010-10-26 01:42:18

标签: c 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

2 个答案:

答案 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”。