如果传输编码被分块,如何使用java获取http响应中的块大小

时间:2013-05-09 10:50:29

标签: http response chunked-encoding

如果传输编码被分块,如何知道HTTP响应块的大小。我无法获得逻辑。 请帮帮我。并提供一些示例java代码来获取chunk的大小。我在一些书中读到每个块的大小是在块本身之前指定的。但是使用哪个逻辑我可以得到它。 请帮我使用java。

谢谢。

1 个答案:

答案 0 :(得分:5)

无法准备好使用代码,但Apache HttpClient库支持开箱即用的“一切”。

这是wikipedia分块响应的例子。在读取正文部分之前,您不知道数据的确切字节大小。请注意每个块的大小是十六进制值,最后0大小的块是数据的结尾。它也由2字节的CRLF分隔符终止。

Transfer-Encoding: chunked\r\n
Content-Type: text/plain\r\n
\r\n
4\r\n
Wiki\r\n
5;extkey=extvalue\r\n
pedia\r\n
E\r\n
.in\r\n
\r\n
chunks.\r\n
0\r\n
AfterBodyHeader: some value\r\n
AfterBodyHeader2: any value\r\n
\r\n
  • 读取字节直到CRLF(十六进制为\ r \ n或0D0A)
  • 放弃一切;分隔符或停止在尾随CRLF,一些回复可能会在块大小的行添加扩展名。除非等待已知的键值对,否则忽略它们。
  • 将十六进制转换为整数,它告诉您块中的数据字节数
  • 读取x个字节并附加到ByteArrayOutputBuffer
  • 读取尾随CRLF分隔符字节并忽略它
  • 如果不是0大小再次读取大小+块数据
  • 某些回复可能会添加 AfterHeaders ,它们就像回复开头的标题一样
  • 在0大小的块之后,空行(\ r \ n)表示完成http响应的结束。如果没有 AfterHeaders ,你应该在最后看到字节0 \ r \ n \ r \ n。请注意,常规块可能包含空行,因此在0大小的指示符之前不要终止解析。

此示例使用\ r \ n占位符指示2字节分隔符作为规范要求