Accept-Encoding 头域导致 content-length 响应头丢失问题分析

Posted 毕小宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Accept-Encoding 头域导致 content-length 响应头丢失问题分析相关的知识,希望对你有一定的参考价值。

背景

最近开发工作内容是用 Netty 实现 http 服务,测试客户端用 Postman ,直接用默认的请求头,结果被 Accept-Encoding 困扰了大半天,本文总结两个默认请求头域的坑点。

Accept-Encoding 导致下载请求失败

问题描述:一个用 Netty 实现的文件下载请求,用 postman 模拟时发现,默认请求头有 Accept-Encoding:gzip, deflate, br 时,即使后端 Netty 响应设置了 content-length 头,也会收不到数据。

表现为:
在这里插入图片描述
一直是进度条状态,无法显示响应文件,此时收到的响应头域是 transfer-encoding:chunked,把后端已经设置的 Content-Length 头域给覆盖了。
在这里插入图片描述
解决办法:去掉该请求头后,响应正常返回了文件,且有长度:
在这里插入图片描述
Body 页有了响应文件内容:
在这里插入图片描述
事实上,反复测试后发现,只要有该头域,大部分情况下,响应内容都没有 content-length ,被 transfer-encoding:chunked 替代了。

Content-Length

如果请求头中的 Content-Length 去掉,则会导致请求被发送两次。

启示录

Accept-Encoding 这个头对文件下载请求的影响,上个月写文件下载请求时已经碰到过了,但是没有整理记录,今天联调测试的时候又出现这个问题,纠结了半天突然又想起来了。

网上的也有说这个头域加上后导致无法解码的问题,即使服务端响应头也有该值,还是无法正常解码。为甚呢?

以上是关于Accept-Encoding 头域导致 content-length 响应头丢失问题分析的主要内容,如果未能解决你的问题,请参考以下文章

http报文头域详解

http断点续传

HTTP-头域

postman之接口测试content-type头域

HTTP协议header标头的通用头域

接口测试-postman头域操作