快速提问 - HTTP响应的状态行是否有最大大小?
在RFC中我找不到这些信息,就像这样:
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
根据这个我可以假设:
HTTP/1.1
)Requested range not satisfiable
所以31字节这将是46字节的总和。
这个假设是正确的还是我错过了什么?
更新
由于下面的答案,我只想稍微说明一下我的问题:
我正在使用来自服务器的TCP消息解析某种日志文件。现在有一些我不关心的随机数据和一些我想阅读的HTTP消息。现在,我得到的所有数据都会解析\r\n
以查找状态行。因为我需要假设我的标题被分成几个TCP包,我只是缓冲所有数据并解析它。
如果标头状态行没有最大大小,我需要缓冲所有数据,直到下一个\r\n
发生。在最坏的情况下,这意味着我将千字节保存为超过千字节的随机数据,因为可以(但很可能不会)成为标题状态行的一部分。
或者,在这种情况下,它是否适合解析HTTP Version String而不是CRLF?
答案 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。