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

时间:2014-12-01 12:23:30

标签: http http-headers httpresponse content-length

RFC表示content-length标题是可选的(“..Applications应该使用此字段...”)。

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

progress

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

1 个答案:

答案 0 :(得分:7)

我认为你的隐含问题是“客户端如何检测HTTP消息的结束?”。见RFC 7230 - HTTP/1.1 Message Syntax and Routing - Message Body Length

  

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

     
      
  1. 对HEAD请求的任何响应以及1xx的任何响应      (信息),204(无内容)或304(未修改)状态      代码总是在第一个空行后终止      标题字段,无论标题字段是否存在      消息,因此不能包含消息正文。

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

  4.   
  5. 如果存在Transfer-Encoding标头字段且已分块      传输编码(第4.1节)是最终编码,即消息      通过读取和解码分块来确定体长      数据直到传输编码表明数据完整。

         

    如果响应中存在Transfer-Encoding标头字段      分块传输编码不是最终编码,      消息体长度是通过读取连接确定的      它由服务器关闭。如果是Transfer-Encoding标头字段      存在于请求中,而分块传输编码则不存在      最终编码,无法确定消息体长度      可靠;服务器必须响应400(错误请求)      状态代码,然后关闭连接。

         

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

  6.   
  7. 如果收到的邮件没有Transfer-Encoding且带有      多个Content-Length头字段有不同      字段值或单个Content-Length头字段具有      无效的值,然后消息框架无效和      收件人必须将其视为不可恢复的错误。如果这是一个      请求消息,服务器必须响应400(错误请求)      状态代码然后关闭连接。如果这是一个回应      代理收到的消息,代理必须关闭连接      到服务器,丢弃收到的响应,并发送502(错误      Gateway)响应客户端。如果这是响应消息      用户代理收到的用户代理必须关闭      连接到服务器并丢弃收到的响应。

  8.   
  9. 如果没有有效的Content-Length标头字段      Transfer-Encoding,其十进制值定义了预期的消息      身体长度以八位字节为单位。如果发件人关闭连接或      收件人在指定的八位字节数之前超时      收到后,收件人必须考虑该消息      不完整并关闭连接。

  10.   
  11. 如果这是一条请求消息,并且以上都不是真的,那么      消息体长度为零(不存在消息体)。

  12.   
  13. 否则,这是没有声明消息的响应消息      体长,所以消息体长度由      服务器关闭之前收到的八位字节数      连接。

  14.   

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

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