当Transfer-Encoding遇上Content-Encoding_虚拟现实_百度空间
当Transfer-Encoding遇上Content-Encoding
HTTP1.1协议中,Response头部可以指定Transfer-Encoding(以下简称TE)和Content-Encoding(以下简称CE)两种编码方式。
开始我简单的以为这两种编码方式不会同时出现,结果是我以为得确实太简单。
TE和CE是出于两种完全不同的目的而设计的,TE是为无法预知Response内容大小而设计的,否则Web Server首先需要把所有内容缓冲在本地,然后通过Content-Length指明长度,常用于动态页面。CE是为节省网络流量设计的,压缩后Response内容更小,常用于纯文本内容。再多的就不啰嗦了。有兴趣的朋友可以读读HTTP RTF文档。
TE和CE独立存在的情况相对简单,有很多文章介绍过详细的处理方式。如果TE和CE同时存在呢?
其实也比较简单。关键是解码先后顺序问题。刚才讲到TE和CE的基本出发点,所以Web Server大概不会设计成先把所有内容缓存起来,然后CE处理,然后再分包做TE处理,因为既然都全部缓存了,就已经知道Content-Length而不需要TE了。有是一些废话:)
知道了这些就简单了,每得到一个TE的chunk分块完整内容,就对其进行CE解压处理,处理好的内容拼接起来就得到最终的内容,处理完所有chunk分块后页面就出来了。
用zlib库实现需要注意,依次处理每个chunk分块中间,要保存z_stream的环境,否则解压就会出错了。