HTTP响应状态 - 行最大大小

时间:2012-03-01 09:15:37

标签: c++ http http-status

快速提问 - HTTP响应的状态行是否有最大大小?

在RFC中我找不到这些信息,就像这样:

  

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

根据这个我可以假设:

  • HTTP版本通常为8字节(例如HTTP/1.1
  • 状态代码为3字节
  • 2个空格+ CRLF是4个字节
  • 原因 - 短语 - >根据RFC,最长的是Requested range not satisfiable所以31字节

这将是46字节的总和。

这个假设是正确的还是我错过了什么?

更新

由于下面的答案,我只想稍微说明一下我的问题:

我正在使用来自服务器的TCP消息解析某种日志文件。现在有一些我不关心的随机数据和一些我想阅读的HTTP消息。现在,我得到的所有数据都会解析\r\n以查找状态行。因为我需要假设我的标题被分成几个TCP包,我只是缓冲所有数据并解析它。

如果标头状态行没有最大大小,我需要缓冲所有数据,直到下一个\r\n发生。在最坏的情况下,这意味着我将千字节保存为超过千字节的随机数据,因为可以(但很可能不会)成为标题状态行的一部分。

或者,在这种情况下,它是否适合解析HTTP Version String而不是CRLF?

2 个答案:

答案 0 :(得分:4)

RFC 2616,6.1.1:

  

这里列出的原因只是建议 - 它们可能是   在不影响协议的情况下替换为本地等效项。

除此之外,如果新代码不对HTTP客户端引入额外要求,则“允许”HTTP协议在不将HTTP版本更改为1.2的情况下添加更多状态代码(在新RFC中)。客户端应该将未知状态代码视为x00(其中x是他们获得的代码的第一个数字,表示响应的类别),除了它们不应该缓存响应。

因此唯一的限制是HTTP标题行或响应标题的最大长度。据我所知,RFC没有定义任何限制,尽管特定服务器强加了自己的限制。

您可以确定的是,用户代理可以完全忽略原因短语。因此,如果它很大,你可以把它读成一小块并一次扔掉一个,直到你达到CRLF。如果要显示人类可读的消息,主要是您可以使用推荐的Reason Phrase作为服务器提供的状态代码,而不管服务器发送的原因短语。

答案 1 :(得分:0)

我认为ReasonPHrase的长度没有任何限制。 W3C文件声明它是一条短信"但这不是规范的。

我不认为版本是8个字符。也许未来的版本可能有3位数,即:HTTP / 10.1。语法指定Version由SPACE分隔,因此我将通过在第一个SPACE停止来解析它。

https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

Reason-Phrase旨在提供Status-Code的简短文字说明。 Status-Code旨在供自动机使用,Reason-Phrase适用于人类用户。客户无需检查或显示Reason-Phrase。