HTTP协议首部字段transfer-encoding与content-length差异

1. 什么问题

最近在写一个http代理,主要作用是接收客户端(JMeter)的http请求报文,解析报文后加密,发送到服务器。接收服务器响应,拼装http响应报文,响应客户端(JMeter)。但是JMter一直提示

org.apache.http.MalformedChunkCodingException: Bad chunk header

2. 原因

响应客户端(JMeter)http报文实体首部使用的是transfer-encoding分块传输,但是http报文实体内容格式使用的content-length描述的实体内容。导致客户端(JMeter)解析有问题,以下是正确的报文格式。

content-length首部字段描述的主体内容格式。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/json;charset=UTF-8
Content-Length: 252
Date: Fri, 17 Jun 2016 02:30:33 GMT

{"respCode":"999","respMessage":"失败"}

transfer-encoding首部字段描述的主体内容格式

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/plain
Transfer-Encoding: chunked
Date: Fri, 17 Jun 2016 02:30:33 GMT

25
This is the data in the first chunk

1A
and this is the second one

0

3. 解决的方法

使用transfer-encoding首部字段描述的主体内容格式。

4. 引出的知识点

两者之间的区别(cr lf统一表示:回车换行)

  • content-length响应报文示例解释
HTTP/1.1 200 OK (什么协议/版本号 状态码 状态描述)
Server: Apache-Coyote/1.1(服务:服务器名称)
Date: Fri, 17 Jun 2016 02:30:33 GMT(日期)
Content-Type: text/json;charset=UTF-8(实体内容类型:文本/JOSN格式;字符集)
Content-Length: 252(实体内容长度:252)(备注:Content-Type和Content-Length属于实体首部)

{
     "respCode":"999","respMessage":"失败"}(实体主体)
  • transfer-encoding响应报文示例解释
HTTP/1.1 200 OK(什么协议/版本号 状态码 状态描述,  cr lf)
Server: Apache-Coyote/1.1(服务:服务器名称,  cr lf)
Content-Type: text/plain(实体内容类型:文本/纯文本格式;字符集,  cr lf)
Transfer-Encoding: chunked(Chunked分块编码传输内容,  cr lf)
Date: Fri, 17 Jun 2016 02:30:33 GMT(日期, cr lf)
 cr lf
25(第一块数据内容十六进制的大小 cr lf)
This is the data in the first chunk(第一块数据内容, cr lf)

1A(第二块数据内容十六进制的大小, cr lf)
and this is the second one(第二块数据内容, cr lf)

00表示报文截止的标志, cr lf)

两者的区别主要是在主体实体之间有差异。

  • transfer-encoding与content-length的含义:

content-length:首部指示出报文中实体主体的字节大小(大小单位字节),注意主体实体内容的字节数与content-length字段的字节数不匹配会导致解析失败)

transfer-encoding:用于高手接收方已经用分块编码对报文进行了传输编码,分块编码是解决服务器动态创建内容,无法知道主体的长度。

你可能感兴趣的:(网络协议,http协议)