4

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

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

状态行 = HTTP 版本 SP 状态代码 SP 原因短语 CRLF

据此,我可以假设:

  • HTTP 版本通常为 8 字节(例如HTTP/1.1
  • 状态码为 3 个字节
  • 2 个空格 + CRLF 为 4 个字节
  • Reason-Phrase -> 根据 RFC,最长的是Requested range not satisfiable31 字节

这将是 46 个字节的总和。

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

更新:

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

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

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

或者,在这种情况下,解析 HTTP 版本字符串而不是 CRLF 是否更合适?

4

2 回答 2

4

RFC 2616、6.1.1:

此处列出的原因短语只是建议——它们可以被本地等效替换而不影响协议。

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

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

您可以确定的是,用户代理可能会完全忽略原因短语。因此,如果它很大,您可以将其分成小块阅读,然后一次扔掉,直到达到 CRLF。如果您想显示人类可读的消息,大多数情况下您可以使用推荐的原因短语作为服务器提供的状态代码,而不管服务器发送什么原因短语。

于 2012-03-01T09:20:30.943 回答
0

我认为 ReasonPHrase 的长度没有任何限制。W3C 文档指出这是一条“短消息”,但这不是规范的。

我不会假设版本是 8 个字符。也许未来的版本可能有 3 位数字,即:HTTP/10.1。语法指定版本由空格分隔,所以我会通过在第一个空格处停止来解析它。

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

原因短语旨在给出状态代码的简短文本描述。状态代码供自动机使用,原因短语供人类用户使用。客户不需要检查或显示原因短语。

于 2016-05-24T20:01:14.963 回答