RFC表示content-length
标题是可选的(“..Applications应该使用此字段...”)。
如果不包括在内,那么我可以收集的内容然后客户端将不知道预期有多少数据,因此在下载正文时(即顶部栏而不是底部)将无法显示确定的进度条。
省略此标题是否还有其他副作用或错误?
答案 0 :(得分:7)
我认为你的隐含问题是“客户端如何检测HTTP消息的结束?”。见RFC 7230 - HTTP/1.1 Message Syntax and Routing - Message Body Length:
邮件正文的长度由以下之一确定 (按优先顺序排列):
对HEAD请求的任何响应以及1xx的任何响应 (信息),204(无内容)或304(未修改)状态 代码总是在第一个空行后终止 标题字段,无论标题字段是否存在 消息,因此不能包含消息正文。
对CONNECT请求的任何2xx(成功)响应都意味着 空连接后,连接将立即成为隧道 结束标题字段的行。客户端必须忽略任何 收到的Content-Length或Transfer-Encoding标头字段 这样的消息。
如果存在Transfer-Encoding标头字段且已分块 传输编码(第4.1节)是最终编码,即消息 通过读取和解码分块来确定体长 数据直到传输编码表明数据完整。
如果响应中存在Transfer-Encoding标头字段 分块传输编码不是最终编码, 消息体长度是通过读取连接确定的 它由服务器关闭。如果是Transfer-Encoding标头字段 存在于请求中,而分块传输编码则不存在 最终编码,无法确定消息体长度 可靠;服务器必须响应400(错误请求) 状态代码,然后关闭连接。
如果收到包含Transfer-Encoding和a的消息 Content-Length头字段,Transfer-Encoding覆盖 内容长度。这样的消息可能表示尝试 执行请求走私(第9.5节)或响应拆分 (第9.4节)并且应该作为错误处理。发件人必须 在转发之前删除收到的Content-Length字段 下游的消息。
如果收到的邮件没有Transfer-Encoding且带有 多个Content-Length头字段有不同 字段值或单个Content-Length头字段具有 无效的值,然后消息框架无效和 收件人必须将其视为不可恢复的错误。如果这是一个 请求消息,服务器必须响应400(错误请求) 状态代码然后关闭连接。如果这是一个回应 代理收到的消息,代理必须关闭连接 到服务器,丢弃收到的响应,并发送502(错误 Gateway)响应客户端。如果这是响应消息 用户代理收到的用户代理必须关闭 连接到服务器并丢弃收到的响应。
如果没有有效的Content-Length标头字段 Transfer-Encoding,其十进制值定义了预期的消息 身体长度以八位字节为单位。如果发件人关闭连接或 收件人在指定的八位字节数之前超时 收到后,收件人必须考虑该消息 不完整并关闭连接。
如果这是一条请求消息,并且以上都不是真的,那么 消息体长度为零(不存在消息体)。
- 醇>
否则,这是没有声明消息的响应消息 体长,所以消息体长度由 服务器关闭之前收到的八位字节数 连接。
当服务器省略content-length头时,它必须使用其他一种机制来指示消息的结束。
所以回答你的问题:方案3(分块)和7(读取直到服务器关闭连接)是客户端事先不知道长度的那些。