繁体   English   中英

为什么HTTP分块编码前缀长度小于实际长度

[英]Why http chunked encoding prefix length smaller than actual length

目前,我正在研究接收tcp流并通过python分析HTTP数据。 这里,我已经了解了如何解码分块数据。 我的问题是:当我保留整个HTTP响应并开始对其进行解码时,但前缀块的大小比实际大小小得多,我将显示如下:

这是我收到的纯数据:

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(字节)

但是如果我通过此算法拆分数据:

    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)

因此,通过我的异常不能在下一循环下车 当我仔细检查响应主体时,我得到len(data)为78543,len(data.decode())为78503,整个响应只有一个块!

然后,我尝试了许多Web设置,但它们都存在此问题。

所以,我的问题是:我怎么了? 如何正确解码此类数据? 感谢您能提供帮助的人!

您的示例代码通过https://www.facebook.com/的响应对我来说效果很好。 对于更容易重现的情况,请尝试查阅Wikipedia文章中的示例:

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进行了解码或重新编码,则可能没有原始数据。 或者,请确保正确连接从套接字读取的数据,而不会引入任何乱码或换行符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM