最近在写一个http代理,主要作用是接收客户端(JMeter)的http请求报文,解析报文后加密,发送到服务器。接收服务器响应,拼装http响应报文,响应客户端(JMeter)。但是JMter一直提示
org.apache.http.MalformedChunkCodingException: Bad chunk header
响应客户端(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
使用transfer-encoding首部字段描述的主体内容格式。
两者之间的区别(cr lf统一表示:回车换行)
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":"失败"}(实体主体)
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)
0(0表示报文截止的标志, cr lf)
两者的区别主要是在主体实体之间有差异。
content-length:首部指示出报文中实体主体的字节大小(大小单位字节),注意主体实体内容的字节数与content-length字段的字节数不匹配会导致解析失败)
transfer-encoding:用于高手接收方已经用分块编码对报文进行了传输编码,分块编码是解决服务器动态创建内容,无法知道主体的长度。