HTTP响应状态行的最大长度

4

快速问题 - HTTP响应的状态行有最大大小限制吗?

在RFC中,我找不到这个信息,只有类似于这样的内容:

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

根据这个,我可以假设:

  • HTTP-Version通常为8个字节(例如HTTP/1.1
  • Status-Code为3个字节
  • 2个空格+ CRLF为4个字节
  • Reason-Phrase-> RFC中最长的是Requested range not satisfiable,因此为31个字节

这将总共为46个字节。

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

更新:

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

我正在解析来自服务器的TCP消息的某种日志文件。现在有一些我不关心的随机数据和一些我想要读取的HTTP消息。现在,我获取的所有数据都会解析一个 \r\n以查找状态行。由于我需要假设我的标头分成几个TCP包,所以我缓冲所有数据并进行解析。

如果状态行的标头没有最大大小限制,我需要缓冲所有数据,直到出现下一个\r\n。在最坏的情况下,这意味着我保存了大量随机数据,因为它可能(但很可能不会)是标头状态行的一部分。

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


由于该行以换行符终止,理论上它可以是无限的。请求/响应头中的所有其他行也是如此。 - Some programmer dude
2个回答

4

RFC 2616,6.1.1:

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

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

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

您可以确定的是用户代理可能完全忽略原因短语。因此,如果它很大,您可以分段阅读并逐个丢弃直到达到CRLF。如果要显示人类可读的消息,则通常可以使用服务器提供的状态代码的推荐原因短语,而不管服务器发送的原因短语如何。


谢谢你的回答 - 我稍微明确了一下我的问题,以便让它更加精确! - Toby
@Toby:根据你的更新,我会说是的,首先检查HTTP版本字符串以确保您有一个HTTP响应。如果有,请查看HTTP响应的其余部分(尽管理论上可能会有kb的原因短语,但实际上不会有,因为这些消息都来自一个真正的服务器,它假定行为相当明智,而不是来自发送其原因短语的理论服务器,以24fps ASCII艺术形式描绘问题的解释性舞蹈)。如果没有,请继续进行。 - Steve Jessop
好的,这意味着我至少可以假设HTTP头状态行始终以HTTP / X.X开头,是吗? - Toby
@Toby:嗯,你的服务器最终可能会支持未来版本的HTTP,因此每个“X”可能会有多个数字。但是那时你仍然需要在某处更新代码,以便理解这个新HTTP版本的响应头。在此之前,HTTP响应将以“HTTP/1.0”或“HTTP/1.1”开头。 - Steve Jessop

0

我认为ReasonPhrase的长度没有限制。W3C文档指出它是一个“短消息”,但这并非是规范。

我不会假设Version为8个字符。也许将来的版本可能有3个数字,比如:HTTP/10.1。语法规定Version由SPACE分隔,因此我会在第一个SPACE处停止解析。

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

Reason-Phrase 旨在提供状态码的简短文本描述。状态码旨在供自动化使用,而 Reason-Phrase 则是为人类用户准备的。客户端不需要检查或显示 Reason-Phrase。


您正在引用已过时的规范(另外,这是IETF规范,而不是W3C规范,顺便说一下)。 - Julian Reschke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接