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

来源:互联网 发布:帝国cms flash网站 编辑:程序博客网 时间:2024/05/29 12:50

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 OKServer: Apache-Coyote/1.1Content-Type: text/json;charset=UTF-8Content-Length: 252Date: Fri, 17 Jun 2016 02:30:33 GMT{"respCode":"999","respMessage":"失败"}

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

HTTP/1.1 200 OKServer: Apache-Coyote/1.1Content-Type: text/plainTransfer-Encoding: chunkedDate: Fri, 17 Jun 2016 02:30:33 GMT25This is the data in the first chunk1Aand this is the second one0

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 lf25(第一块数据内容十六进制的大小 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:用于高手接收方已经用分块编码对报文进行了传输编码,分块编码是解决服务器动态创建内容,无法知道主体的长度。

1 0
原创粉丝点击