简单测试Content-Length和Chunked两种不同的数据传输方式
Posted 默辨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单测试Content-Length和Chunked两种不同的数据传输方式相关的知识,希望对你有一定的参考价值。
文章目录
Content-Length:按照数据长度进行数据传输
Chunk:按照块进行数据传输
如下图的样例请求,只是此时的Content-length为响应头中
一、代码测试
本文将使用ApiPost对两种不同的携带数据的方法进行测试
1、前期准备
1、准备一个ApiPost(自己使用postman进行测试时,无法测试成功)
2、编写对应的测试类
public class TestServerSocket
public static void main(String[] args) throws IOException
ServerSocket socket = new ServerSocket(8089);
Socket accept = socket.accept();
InputStream inputStream = accept.getInputStream();
while (true)
byte[] bytes = new byte[100000];
int readLength = inputStream.read(bytes);
System.out.println(new String(bytes, 0, readLength));
System.out.println("----完成一次数据接收over----");
2、测试Content-length
1、发送信息给8089端口,携带参数为name和age
2、查看控制台的数据信息
我们会发现默认携带的参数是content-length,且长度为269个字节。
3、测试Transfer-Encoding:chunked
1、修改ApiPost的请求头,添加对应的Transfer-Encoding参数
2、携带的参数和不变,再次使用ApiPost测试,查看控制台数据
此时请求的参数信息中,既包含了Content-length,又包含了Transfer-Encoding:chunked。但是底下的数据展示好像不一样,使用chunked后,数据由之前的单行字符串mobian,变成了多行数据。且mobian前面的6刚好是mobian字符串的长度,23前面的2刚好是23的长度,最后以0结尾。
总结:
即content-length是以数据的总的长度进行传输,而chunked是以分块的形式传输,每一块内部又根据前面的长度进行传输,直到遇到长度为0后,停止数据传输。如果两个同时存在,则content-length失效。
二、tomcat源码
tomcat中对Content-length和Transfer-Encoding的数据处理。
1、Request过程
一个请求在tomcat的内部调用逻辑这里不再赘述,不了解的可以参考我之前的博客:浅谈Tomcat接收到一个请求后在其内部的执行流程(源码)
最终是会调用到prepareRequest()方法
1、prepareRequest方法直到下图的位置后
- 首先会去获取transfer-encoding属性
- 然后根据后面配置的参数,传给addInputFilter方法
2、如果后面跟着的参数是chunked,那么将contentDelimitation设置为true
3、解析完transfer-encoding后
- 首先获取contentLength
- 在内容长度大于0后,会判断contentDelimitation的状态,如果我们配置了chunked那么改值为true
- contentDelimitation为true后,会移除content-length节点,即两者同时存在,contentlength失效
2、其他
如果你想了解contentlength和chunked两种方式具体的读取数据的逻辑代码,你可以查看InputFilter接口的两个实现类,即IdentityInputFilter(contentlength)和ChunkedInputFilter(chunked)两个类的doRead方法。
以上是关于简单测试Content-Length和Chunked两种不同的数据传输方式的主要内容,如果未能解决你的问题,请参考以下文章
在camel cxf客户端请求中的Http头Content-Length
Accept-Encoding 头域导致 content-length 响应头丢失问题分析
POST Content-Length of 51110424 bytes 超出了 Unknown on line 0 中 41943040 字节的限制