【问题标题】:Why http chunked encoding prefix length smaller than actual length为什么http分块编码前缀长度小于实际长度
【发布时间】:2015-04-15 07:00:14
【问题描述】:

目前,我正在研究接收 tcp 流并通过 python 分析 HTTP 数据。我已经在here 了解了如何解码分块数据。我的问题是:当我持有整个 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 (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)

所以它通过我一个异常,无法在下一个循环中关闭。 当我仔细检查响应体时,我得到 len(data) 是 78543,len(data.decode()) 是 78503,整个响应只有一个块!

然后我尝试了很多网络设置,他们都遇到了这个问题。

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

【问题讨论】:

    标签: python http chunked-encoding


    【解决方案1】:

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

    【讨论】:

    • 是的,我在解析缓冲区时犯了一个错误。因此,实际长度与前缀长度不同。
    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 2019-11-04
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多