tornado web 应用程序无法解码压缩的 http body

tornado web application fails to decode compressed http body

我正在编写一些简单的原型 tornado Web 应用程序,发现 tornado 无法使用

解码 http 请求 body
Error -3 while decompressing: incorrect header check

从其中一个 tornado Web 应用程序,我通过使用 zlib 压缩 body 来发送 http 请求。

http_body = zlib.compress(data)

并且还添加了 http header:

'Content-Encoding': 'gzip' 

但是,当我在另一个 tornado web 应用程序中收到此 http 请求时,我看到它导致解压缩失败,如上所述。

处理 http 请求的示例代码:

class MyRequestHandler(tornado.web.RequestHandler):
    def post(self):
        global num
        message = self.request.body
        self.set_status(200)

我还确保 decompress_request=True 当应用程序监听时。

我检查了 tornado 文档和更早的 post,但没有发现任何关于压缩的 http body 部分或其任何示例的信息。唯一提到的是 decompress_response 参数,它只是确保来自服务器的压缩 http 响应。

我是否遗漏了任何设置?

gzipzlib 都基于相同的底层压缩算法,但它们不是一回事。您必须在此处使用 gzip 而不仅仅是 zlib

def post_gzip(self, body):
    bytesio = BytesIO()
    gzip_file = gzip.GzipFile(mode='w', fileobj=bytesio)
    gzip_file.write(utf8(body))
    gzip_file.close()
    compressed_body = bytesio.getvalue()
    return self.fetch('/', method='POST', body=compressed_body,
                      headers={'Content-Encoding': 'gzip'})

一些 zlib 函数也采用神秘的选项,使它们产生 gzip 格式的输出。这些可以与 zlib.decompressobjzlib.compressobj 一起使用以进行流式压缩和解压缩。