HTTP返回response头信息中
带有Transfer-Encoding = chunked表示使用chunked封包传输
Chunked格式:
0000-000F 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK.
0010-001F 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content-Type: t
0020-002F 65 78 74 2f 70 6c 61 69 6e 0d 0a 54 72 61 6e 73 ext/plain..Trans
0030-003F 66 65 72 2d 45 6e 63 6f 64 69 6e 67 3a 20 63 68 fer-Encoding: ch
0040-004F 75 6e 6b 65 64 0d 0a 0d 0a 32 35 0d 0a 54 68 69 unked....25..Thi
0050-005F 73 20 69 73 20 74 68 65 20 64 61 74 61 20 69 6e s is the data in
0060-006F 20 74 68 65 20 66 69 72 73 74 20 63 68 75 6e 6b the first chunk
0070-007F 0d 0a 0d 0a 31 41 0d 0a 61 6e 64 20 74 68 69 73 ....1A..and this
0080-008F 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6f is the second o
0090-009F 6e 65 0d 0a 30 0d 0a 0d 0a ne..0....
StringBuilder sb = new StringBuilder();
sb.append("HTTP/1.1 200 OK\r\n");
sb.append("Content-Type: text/plain\r\n");
sb.append("Transfer-Encoding: chunked\r\n\r\n");
sb.append("25\r\n");
sb.append("This is the data in the first chunk\r\n"); // 37 bytes
sb.append("\r\n1A\r\n");
sb.append("and this is the second one"); // 26 bytes
sb.append("\r\n0\r\n\r\n");
十六进制包长+\r\n+报文包+\r\n 为一个传输单元
0+\r\n+\r\n 当遇到这种空传输单元时结束
Chunked解析:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("25\r\n");
sb.append("This is the data in the first chunk\r\n");
sb.append("\r\n1A\r\n");
sb.append("and this is the second one");
sb.append("\r\n0\r\n\r\n");
ByteBuffer in = ByteBuffer.allocate(1024);
in.put(sb.toString().getBytes());
in.flip();
int start = in.position();
int end = in.limit();
ByteBuffer content = ByteBuffer.allocate(1024);
while (true) { // 封包循环
for (int i = start; i < end - 1; i++) {
if (in.get(i) == 0x0D && in.get(i + 1) == 0x0A) {
byte[] nums = new byte[i - start];
in.get(nums);
// 丢弃\r\n
in.get(new byte[2]);
int num = Integer.parseInt(new String(nums), 16);
byte[] strs = new byte[num];
in.get(strs);
content.put(strs);
// 丢弃\r\n
in.get(new byte[2]);
start = i + 4 + num;
break;
}
}
if (in.get(start) == 0x30 && in.get(start + 1) == 0x0D && in.get(start + 2) == 0x0A && in.get(start + 3) == 0x0D && in.get(start + 4) == 0x0A) {
content.flip();
in.get(new byte[5]);
break;
}
}
System.out.println(new String(content.array(), 0, content.limit()));
}
因为主流Http Server都将Chunked解析代码封装好了,只有自己编写socket或是mina开发中会遇到
所以给出个采用NIO的Buffer传输的示例,若用字节流或是byte[]需要稍作修改
分享到:
相关推荐
1. **读取头部信息**:首先,你需要解析HTTP响应头,寻找`Transfer-Encoding: chunked`字段,这表明后续的数据将以chunked编码的形式传输。同时,也要注意`Content-Type`头,因为它定义了数据的类型。 2. **理解...
在本话题中,我们将探讨如何利用Boost.ASIO库进行HTTP请求,并专注于处理“chunked”编码,这是一种在HTTP传输过程中分块发送数据的方式。 首先,Boost.ASIO是Boost库的一部分,专门用于异步I/O操作,如网络通信。...
Chunked编码是HTTP协议(特别是HTTP/1.1版本)中的一种传输机制,它允许发送方将大响应体分块发送,而不是一次性发送完整个响应。这种编码方式尤其适用于那些在传输过程中大小未知或不断变化的数据流。 Chunked编码...
HTTP 1.1 的 Chunked 编码是一种特殊的传输编码方式,用于在不知道数据总长度的情况下传输动态生成的内容。根据 RFC 2616 的 3.6.1 节描述,chunked 编码通过将消息体分成一系列的块(chunk),每个块都有自己的大小...
burpsuite分块传输插件,一键生成分块传输请求,用于bypass waf等
netty案例,netty4.1中级拓展篇十一《Netty基于ChunkedStream数据流切块传输》源码 ...
在本文中,我们将深入探讨如何利用 Netty 4.0.23 版本来实现文件的传输,这包括客户端和服务器端的交互过程。 1. **Netty 基本概念** - **BossGroup 和 WorkerGroup**:Netty 中的核心概念,BossGroup 负责接收新...
一个对chunked编码进行解码的例子,通过java socket实现发送http请求,对gzip压缩的消息体进行解码处理。
Chunked编码是HTTP协议中的一个特性,主要用在HTTP 1.1版本中,用于处理不确定长度的数据传输。这种编码方式允许发送方在不知道消息总长度的情况下,将数据分块发送,每一块都伴随着其大小的标识,最后一块则使用一...
HTTP1.1协议引入了一种名为`CHUNKED`...通过以上步骤,C语言能够有效地处理`CHUNKED`编码的HTTP响应,确保正确接收和存储流式传输的数据。这对于构建网络应用,尤其是涉及文件下载等需要处理大体积数据的场景至关重要。
1. **HTTP/1.1的Chunked编码**:HTTP/1.1引入了Chunked编码,允许服务器将大文件分成多个小块(chunk)发送,减少了对网络带宽的瞬间需求,改善了传输效率。 2. **HTTP/2多路复用**:HTTP/2协议通过TCP连接的多路...
burpsuit分块传输插件,用于分块传输数据包来绕过WAF
本文将深入探讨一个使用C语言实现的HTTP协议解析器,并分析其设计原理和关键功能。 首先,我们来看一个纯C语言编写的HTTP协议解析器的重要性。在没有依赖任何库函数的情况下,这样的解析器可以提供更高的性能和灵活...
已经打包好的,可直接导入burp使用
在HTTP协议中,`Transfer-Encoding: chunked`是一种用于分块传输编码的方式,常用于服务器无法预先知道响应体总长度的情况。这种方式将响应体分成多个块(chunks),每一块都有一个大小标识,最后以一个零长度的块...
进行Chunked编码传输的HTTP Response会在消息头部设置: Transfer-Encoding: chunked 表示Content Body将用Chunked编码传输内容。 Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。每个...
在HTTP协议中,"Chunked Transfer Encoding"是一种用于无固定长度内容传输的方式,它允许服务器在不知道消息主体的总大小时就开始发送数据。在Java中,处理chunked数据通常涉及到Socket编程,因为Socket是网络通信的...