为什么http chunked编码前缀长度小于实际长度
Why http chunked encoding prefix length smaller than actual length
目前,我正在通过 python 接收 tcp 流并分析 HTTP 数据。我已经在 here 了解了如何解码分块数据。我的问题是:当我持有整个 HTTP 响应并开始对其进行解码时,但前缀块大小比实际 size.I 小得多,如下所示:
这是我收到的纯数据:
b'000096F6\r\n<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://opengraphprotocol.org/schema/ fb: http://www.facebook.com/2010/fbml d: http://dictionary.com/2011/dml">\n<head>\n<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>\n<base href="http://dictionary.reference.com/">\n<title>Search | Define Search at Dictionary.com</title>\n<script.....(more data)
您可以看到前缀大小为 (hex)96F6 = 38646 (bytes)
但是如果我按照这个算法拆分数据:
encoded = row_data;
new_data = ""
while encoded != '':
off = int(encoded[:encoded.index('\r\n')], 16)
if off == 0:
break
encoded = encoded[encoded.index('\r\n') + 2:]
new_data = new_data.__add__(encoded[:off])
encoded = encoded[off + 2:]
return new_data
我只能得到两个损坏的组:
(more data).....<div class="dot dot-left dot-bottom "></
和
v>
<div class="language-name oneClick-disabled">.....(more data)
所以它通过我在下一个循环中无法获得 off 的异常。
当我仔细检查响应主体时,我得到 len(data) 是 78543 和 len(data.decode()) 是 78503,整个响应只有一个块!
然后我试了很多web set都出现这个问题
所以,我的问题是:我怎么了?如何正确解码此类数据?
感谢能提供帮助的人!
你的示例代码对我来说效果很好,得到了 https://www.facebook.com/
的回复。对于更容易重现的案例,请尝试 the Wikipedia article:
中的示例
4\r\n
Wiki\r\n
5\r\n
pedia\r\n
e\r\n
in\r\n\r\nchunks.\r\n
0\r\n
\r\n
或者,作为 Python 字符串:
encoded = '4\r\nWiki\r\n5\r\npedia\r\ne\r\n in\r\n\r\nchunks.\r\n0\r\n\r\n'
使用你的代码,这给出:
Wikipedia in
chunks.
符合预期。
您程序中其他地方最有可能出现的两个错误是编码或网络错误。请注意,块长度以字节为单位指定。如果您在任何时候解码或重新编码 row_data
,那么您可能没有原始数据。或者,确保正确连接从套接字读取的数据,而不引入任何虚假空格或换行符。
目前,我正在通过 python 接收 tcp 流并分析 HTTP 数据。我已经在 here 了解了如何解码分块数据。我的问题是:当我持有整个 HTTP 响应并开始对其进行解码时,但前缀块大小比实际 size.I 小得多,如下所示:
这是我收到的纯数据:
b'000096F6\r\n<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://opengraphprotocol.org/schema/ fb: http://www.facebook.com/2010/fbml d: http://dictionary.com/2011/dml">\n<head>\n<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>\n<base href="http://dictionary.reference.com/">\n<title>Search | Define Search at Dictionary.com</title>\n<script.....(more data)
您可以看到前缀大小为 (hex)96F6 = 38646 (bytes)
但是如果我按照这个算法拆分数据:
encoded = row_data;
new_data = ""
while encoded != '':
off = int(encoded[:encoded.index('\r\n')], 16)
if off == 0:
break
encoded = encoded[encoded.index('\r\n') + 2:]
new_data = new_data.__add__(encoded[:off])
encoded = encoded[off + 2:]
return new_data
我只能得到两个损坏的组:
(more data).....<div class="dot dot-left dot-bottom "></
和
v>
<div class="language-name oneClick-disabled">.....(more data)
所以它通过我在下一个循环中无法获得 off 的异常。 当我仔细检查响应主体时,我得到 len(data) 是 78543 和 len(data.decode()) 是 78503,整个响应只有一个块!
然后我试了很多web set都出现这个问题
所以,我的问题是:我怎么了?如何正确解码此类数据? 感谢能提供帮助的人!
你的示例代码对我来说效果很好,得到了 https://www.facebook.com/
的回复。对于更容易重现的案例,请尝试 the Wikipedia article:
4\r\n
Wiki\r\n
5\r\n
pedia\r\n
e\r\n
in\r\n\r\nchunks.\r\n
0\r\n
\r\n
或者,作为 Python 字符串:
encoded = '4\r\nWiki\r\n5\r\npedia\r\ne\r\n in\r\n\r\nchunks.\r\n0\r\n\r\n'
使用你的代码,这给出:
Wikipedia in
chunks.
符合预期。
您程序中其他地方最有可能出现的两个错误是编码或网络错误。请注意,块长度以字节为单位指定。如果您在任何时候解码或重新编码 row_data
,那么您可能没有原始数据。或者,确保正确连接从套接字读取的数据,而不引入任何虚假空格或换行符。