不在服务器响应中包含内容长度标头会产生什么后果?

Rob*_*ert 3 http httpresponse content-length http-headers

RFC说,content-length头是可选的("..Applications应使用此字段...").

从我可以收集的内容中,如果不包括在内,那么客户端将不知道预期有多少数据,因此在下载正文时(即顶部栏而不是底部)将无法显示确定的进度条.

进展

省略此标题是否还有其他副作用或错误?

Cod*_*ter 8

我认为你的隐含问题是"客户端如何检测HTTP消息的结束?" .请参阅RFC 7230 - HTTP/1.1消息语法和路由 - 消息正文长度:

消息正文的长度由以下之一确定(按优先顺序排列):

  1. 对HEAD请求的任何响应以及具有1xx(信息),204(无内容)或304(未修改)状态代码的任何响应始终由标头字段后的第一个空行终止,而不管头部字段是否存在于消息,因此不能包含消息体.

  2. 对CONNECT请求的任何2xx(成功)响应意味着连接将在结束头字段的空行之后立即成为隧道.客户端必须忽略在这样的消息中接收的任何Content-Length或Transfer-Encoding头字段.

  3. 如果存在传输编码头字段并且分块传输编码(部分4.1)是最终编码,则通过读取和解码分块数据来确定消息体长度,直到传输编码指示数据完成为止.

    如果响应中存在Transfer-Encoding头字段并且分块传输编码不是最终编码,则通过读取连接来确定消息体长度,直到服务器关闭它.如果请求中存在Transfer-Encoding头字段并且分块传输编码不是最终编码,则不能可靠地确定消息体长度; 服务器必须使用400(错误请求)状态代码进行响应,然后关闭连接.

    如果收到包含Transfer-Encoding和Content-Length头字段的消息,则Transfer-Encoding将覆盖Content-Length.这样的消息可能表示尝试执行请求走私(第9.5节)或响应拆分(第9.4节),并且应该作为错误处理.发送方必须在向下游转发此类消息之前删除收到的Content-Length字段.

  4. 如果在没有Transfer-Encoding的情况下收到消息并且具有不同字段值的多个Content-Length头字段或具有无效值的单个Content-Length头字段,则消息成帧无效且接收者必须将其视为不可恢复的错误.如果这是请求消息,则服务器必须以400(错误请求)状态代码响应,然后关闭连接.如果这是代理收到的响应消息,则代理必须关闭与服务器的连接,丢弃收到的响应,并向客户端发送502(Bad Gateway)响应.如果这是用户代理收到的响应消息,则用户代理必须关闭与服务器的连接并丢弃收到的响应.

  5. 如果在没有Transfer-Encoding的情况下存在有效的Content-Length头字段,则其十进制值以八位字节定义预期的消息体长度.如果发送方关闭连接或接收方在收到指定的八位字节数之前超时,则接收方必须认为该消息不完整并关闭连接.

  6. 如果这是请求消息而且以上都不是真的,那么消息体长度为零(不存在消息体).

  7. 否则,这是没有声明的消息体长度的响应消息,因此消息体长度由服务器关闭连接之前接收的八位字节数确定.

当服务器省略content-length头时,它必须使用其他一种机制来指示消息的结束.

所以回答你的问题:场景3(分块)和7(读取直到服务器关闭连接)是客户端事先不知道长度的那些.