HTTP的早期版本采用关闭连接的办法来划定报文的结束。但是,没有实体长度信息的话,客户端无法判断连接关闭到底是因为报文结束才关闭的还是因为服务器崩溃才关闭的。而且,对于现在常用的长连接(keep alive),更是需要一种确定实体长度的方法。
这就是Content-Length出现的原因。首部的这个属性可以指出了实体部分的字节长度,这样客户端就知道报文到什么时候结束了。
但是,有一种情况,使用持久连接(长连接)时可以没有Content-Length首部。即采用分块编码(chunk)的时候。使用分块编码的时候,数据是分块发送的,每块都有大小说明。有些动态内容生成可能比较耗时,服务器希望提高响应速度,就会选择边生成响应内容边发送的方式。但是,内容没有完全生成之前是无法计算Content-Length的,所以,取而代之的就是分块的方法。
那么现在,问题来了,怎样确定实体主体的长度呢?
主体定界规则
理论上,实体主体的长度应该按照下面的规则来进行匹配。
1. 判断是否是不允许带有主体的特定的HTTP报文类型。这种情况下,就算出现Content-Length,也应该忽略它。会有Content-Length出现但是又没有实体的报文有以下几个常见的例子:
l HEAD响应。服务器发送的首部等价于GET请求发送的首部,但是服务器不会发送实体。
l 1XX、204以及304响应也可以有提示性的Content-Length首部,但是也都没有实体。
2. 如果报文含有描述传输编码的Transfer-Encoding首部(不采用默认的HTTP“恒等”编码),那实体就应由一个称为“零字节块”的特殊模式结束。具体编码方式如下:
l 由一系列分块组成,每个分块包含一个长度值和该分块的数据。长度值是十六进制形式的数,并通过CRLF与数据分隔开。
l 分块中的数据的大小以字节计算,不包