HTTP实体长度的确定规则

HTTP报文中的实体长度可通过Content-Length、Transfer-Encoding(分块编码)或者根据多部分媒体类型(multipart/byteranges)的规则来确定。Content-Length表示实体字节长度,分块编码用于动态内容的传输,而multipart/byteranges用于多部分响应。多部分媒体类型常用于表单提交和范围响应,边界值用来区分各个部分。

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  分块中的数据的大小以字节计算,不包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值