简单测试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方法直到下图的位置后

  1. 首先会去获取transfer-encoding属性
  2. 然后根据后面配置的参数,传给addInputFilter方法



2、如果后面跟着的参数是chunked,那么将contentDelimitation设置为true



3、解析完transfer-encoding后

  1. 首先获取contentLength
  2. 在内容长度大于0后,会判断contentDelimitation的状态,如果我们配置了chunked那么改值为true
  3. contentDelimitation为true后,会移除content-length节点,即两者同时存在,contentlength失效




2、其他

如果你想了解contentlength和chunked两种方式具体的读取数据的逻辑代码,你可以查看InputFilter接口的两个实现类,即IdentityInputFilter(contentlength)和ChunkedInputFilter(chunked)两个类的doRead方法。

以上是关于简单测试Content-Length和Chunked两种不同的数据传输方式的主要内容,如果未能解决你的问题,请参考以下文章

content-length 怎么用

Http协议之Content-Length

在camel cxf客户端请求中的Http头Content-Length

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

POST Content-Length of 51110424 bytes 超出了 Unknown on line 0 中 41943040 字节的限制

HTTP之实体和编码