文章目录
1. 背景
2. 原因
3. 解决方式
4. 知识点
4.1 Fiddler
4.2 Http
4.3 CDN
5.附录
5.1 请求&回包头部信息
1. 背景
使用Okhttp的框架,在七牛服务器上进行文件下载,发现一个奇怪的问题,在进行 Http 进行下载的时候,Response 的回包里面,偶尔会出现没有 Content-Length 的情况,导致无法准确的获取下载进度。
在查找问题的过程中,较深入的了解Http下载的流程和fiddler抓包工具的使用,并在与七牛的运维确定问题后,给出了我认为较合理的解决方案。
2. 原因
造成没有 Content-Length 的原因,是由于七牛的服务器没有返回这个字段,七牛方面给出的回复如下:
这边排查当请求头带有 Accept-encoding: gzip 时,第一次请求到某个节点时,会没有 content-length 头,第二次请求到相同节点,就会带这个头了。
当 CDN 节点需要做 gzip 压缩时,为加快第一次响应速度,会在做完 gzip 压缩后直接先响应内容,再计算 content-length ,这样第二次访问到该节点的时候,会把上次的 gzip 压缩内容和 content-length 都返回。
1
2
3
所以原因总结要点如下:
七牛服务器默认会对文本格式的文件进行 gzip 压缩,也只有文本格式的文件会出现返回的 Response 里面没有 Content-Length 的问题。(目前与