使用zlib + dictionary压缩/解压缩spdy名称/值块时出错

卢维gil

我试图编写一个spdy代理服务器,但是在压缩/解压缩spdy名称/值块时遇到问题。

我正在使用python 3.3 zlib库对字典进行压缩/解压缩。

从chrome 31接收间谍帧时,大多数时间都可以解析帧,但是某些名称/值块无法正确解压缩。

我有3个测试用例:

import zlib

dictionary = (
b"optionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-"
b"languageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi"
b"f-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser"
b"-agent10010120020120220320420520630030130230330430530630740040140240340440"
b"5406407408409410411412413414415416417500501502503504505accept-rangesageeta"
b"glocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic"
b"ateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran"
b"sfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati"
b"oncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo"
b"ndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe"
b"pOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic"
b"ation/xhtmltext/plainpublicmax-agecharset=iso-8859-1utf-8gzipdeflateHTTP/1"
b".1statusversionurl\0")


def decompress(buf):
    decompressor = zlib.decompressobj(zdict=dictionary)
    return decompressor.decompress(buf)

def compress(buf):
    compressor = zlib.compressobj(zdict=dictionary)
    return compressor.compress(buf)

if __name__ == '__main__':
    # Test 1: buf -(compress)-> cb -(decompress)->buf2, buf2 become ''
    buf = b'\x00\x01\x00\x06status\x00\x1a200 Connection established'
    print(buf)
    cb = compress(buf)
    print(cb)  # b'x\xbb\xdf\xa2Q\xb2'
    buf = decompress(cb)
    print(buf) # b''

    # Test 2: This name/value block data was sent by chrome, which decompressed correctly
    print(decompress(b'8\xea\xdf\xa2Q\xb2b`e`\x01\xe5\x12\x06\x9e4`\xc6K\x02\x06\x83^r~.\x03[.0o\xe6\xa70\xb0;\xfb\xfb\xf9\xb9:\x8700\x83\x14\x0b\x00\x04PZbrjR~~\xb6^r~\xae\x95\x89\x891@\x001p!\x12<C\x8eo~UfNN\xa2\xbe\xa9\x9e\x81\x82Fxf^J~y\xb1\x82_\x88\x82\x99\x9e\xa1\xb5B\xb8\x7f\xb8\x99\x89\xa6\x82#\xd0K\xa9\xe1\xa9I\xde\x99%\xfa\xa6\xc6\xe6z\xc6f\n\x1a\xde\x1e!\xbe>:\n9\x99\xd9\xa9\n\xee\xa9\xc9\xd9\xf9\x9a\n\xce\x19\xc0\xdc\x9b\xaaol\xa8g\xa0ghfj\xa0gf\xac\x10\x9c\x98\x96X\x94\t\xd5\xc5\xc0\x0e\xf5\x04\x03\x07\xcco\x00\x00\x00\x00\xff\xff'))
    # b'\x00\x05\x00\x04host\x00\x0cfacebook.com\x00\x06method\x00\x07CONNECT\x00\x03url\x00\x10facebook.com:443\x00\nuser-agent\x00lMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36\x00\x07version\x00\x08HTTP/1.1'

    # Test 3: This was another name/value block data sent by chrome, which can not be decompressed
    print(decompress(b'"\xcd+\x00\x01\x94\x96\x98\x9c\x9a\x94\x9f\x9f\xad\x97\x9c\x9fkebb\x0c\x10@\x83\xca+\x00\x00\x00\x00\xff\xff'))
    # Error -3 while decompressing data: incorrect header check

我是python3 + zlib的新手(在此项目之前使用python 2.7)和spdy。非常感谢您的帮助。

马克·阿德勒

您需要刷新以进行压缩和解压缩。否则,部分或全部数据将保留在对象中。IE:

def decompress(buf):
    decompressor = zlib.decompressobj()
    result = decompressor.decompress(buf)
    return result + decompressor.flush()

def compress(buf):
    compressor = zlib.compressobj()
    result = compressor.compress(buf)
    return result + compressor.flush()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用VBS解压缩时出错

来自分类Dev

使用javaFX解压缩文件时出错

来自分类Dev

JavaScript Zlib解压缩

来自分类Dev

使用zlib压缩目录

来自分类Dev

解压缩时Python zlib模块错误?

来自分类Dev

zlib进行解压缩操作

来自分类Dev

使用zlib压缩/解压缩char数组,缺少一些字符

来自分类Dev

使用DEFLATE(RFC 1951)函数压缩和解压缩zlib(RFC 1950)

来自分类Dev

使用zlib压缩/解压缩char数组,缺少一些字符

来自分类Dev

使用zlib解压缩来自TCP连接的传入数据(压缩数据)

来自分类Dev

使用字节切片解压缩压缩的ZLib字符串

来自分类Dev

zlib解压缩和压缩时如何保留标题和结尾

来自分类Dev

使用12mb文件大小的解压缩时出错

来自分类Dev

使用zlib压缩多个文件

来自分类Dev

Node.js:指定要使用zlib + tar解压缩的文件

来自分类Dev

使用zlib / minizip解压缩zip文件:C / C ++应用程序

来自分类Dev

在Java中使用zlib解压缩(错误的标头检查)

来自分类Dev

使用zlib / minizip解压缩zip文件:C / C ++应用程序

来自分类Dev

使用工件名称解压缩gradle依赖项

来自分类Dev

使用工件名称解压缩gradle依赖项

来自分类Dev

如何使用zlib.gzipSync(buffer [,options])来压缩文件,以及如何使用zlib.gunzipSync(buffer [,options])来解压缩文件?

来自分类Dev

使用sklearn columntransfromer时解压缩错误

来自分类Dev

使用Lambda解压缩可变参数时的增量指针

来自分类Dev

使用 jq 解压/解压缩 JSON

来自分类Dev

zlib.error解压缩时出现错误-3:不正确的标头检查

来自分类Dev

zlib.error:解压缩时发生错误-3:无效的距离代码

来自分类Dev

Java中的Zlib解压缩不起作用

来自分类Dev

C ++ ZLib GZipStream解压缩NULL终止

来自分类Dev

python zlib如何解压缩许多对象

Related 相关文章

  1. 1

    使用VBS解压缩时出错

  2. 2

    使用javaFX解压缩文件时出错

  3. 3

    JavaScript Zlib解压缩

  4. 4

    使用zlib压缩目录

  5. 5

    解压缩时Python zlib模块错误?

  6. 6

    zlib进行解压缩操作

  7. 7

    使用zlib压缩/解压缩char数组,缺少一些字符

  8. 8

    使用DEFLATE(RFC 1951)函数压缩和解压缩zlib(RFC 1950)

  9. 9

    使用zlib压缩/解压缩char数组,缺少一些字符

  10. 10

    使用zlib解压缩来自TCP连接的传入数据(压缩数据)

  11. 11

    使用字节切片解压缩压缩的ZLib字符串

  12. 12

    zlib解压缩和压缩时如何保留标题和结尾

  13. 13

    使用12mb文件大小的解压缩时出错

  14. 14

    使用zlib压缩多个文件

  15. 15

    Node.js:指定要使用zlib + tar解压缩的文件

  16. 16

    使用zlib / minizip解压缩zip文件:C / C ++应用程序

  17. 17

    在Java中使用zlib解压缩(错误的标头检查)

  18. 18

    使用zlib / minizip解压缩zip文件:C / C ++应用程序

  19. 19

    使用工件名称解压缩gradle依赖项

  20. 20

    使用工件名称解压缩gradle依赖项

  21. 21

    如何使用zlib.gzipSync(buffer [,options])来压缩文件,以及如何使用zlib.gunzipSync(buffer [,options])来解压缩文件?

  22. 22

    使用sklearn columntransfromer时解压缩错误

  23. 23

    使用Lambda解压缩可变参数时的增量指针

  24. 24

    使用 jq 解压/解压缩 JSON

  25. 25

    zlib.error解压缩时出现错误-3:不正确的标头检查

  26. 26

    zlib.error:解压缩时发生错误-3:无效的距离代码

  27. 27

    Java中的Zlib解压缩不起作用

  28. 28

    C ++ ZLib GZipStream解压缩NULL终止

  29. 29

    python zlib如何解压缩许多对象

热门标签

归档