是否有必要同时检查' \ r \ n \ r \ n'和' \ n \ n&n;作为HTTP标头/内容分隔符?

时间:2014-11-07 23:32:24

标签: http http-headers

接受的答案on this page说我们应该检查\r\n\r\n\n\n的HTTP服务器响应,作为将标题与内容分开的序列。

像:

HTTP/1.1 200 Ok\r\n
Server: AAA\r\n
Cache-Control: no-cache\r\n
Date: Fri, 07 Nov 2014 23:20:27 GMT\r\n
Content-Type: text/html\r\n
Connection: close\r\n\r\n   <--------------

或:

HTTP/1.1 200 Ok\r\n
Server: AAA\r\n
Cache-Control: no-cache\r\n
Date: Fri, 07 Nov 2014 23:20:27 GMT\r\n
Content-Type: text/html\r\n
Connection: close\n\n   <--------------

在我在Wireshark中看到的所有回复中,服务器使用\r\n\r\n

是否真的有必要检查两者?哪些服务器/协议版本将使用\n\n

2 个答案:

答案 0 :(得分:0)

HTTP spec说:

  

消息头字段的行终止符是序列CRLF。但是,我们建议应用程序在解析此类标头时,将单个LF识别为行终止符并忽略前导CR。

在实践中,我从未见过带有CR行分隔符的Web服务器。

答案 1 :(得分:0)

我从 \r\n\r\n 开始,但很快发现一些使用 \n\n 的网站。看看像 curl 这样的专业库,他们也会处理 \n\n,即使它不符合标准。

我真的不知道 curl 代码,但请参阅此处的示例:https://github.com/curl/curl/blob/7a33c4dff985313f60f39fcde2f89d5aa43381c8/lib/http.c#L1406-L1413

/* find the end of the header line */
  end = strchr(start, '\r'); /* lines end with CRLF */
  if(!end) {
    /* in case there's a non-standard compliant line here */
    end = strchr(start, '\n');

    if(!end)
      /* hm, there's no line ending here, use the zero byte! */
      end = strchr(start, '\0');
  }

看着这一点,我认为即使是 \0\0 也会被处理。

所以:

  • 要处理那里的“任何事情”,那么是的。
  • 如果您想严格遵守标准,则不需要。