通过Python中的TCP套接字发送gzip压缩数据

时间:2016-09-09 13:57:07

标签: python sockets http get bzip

我在Python中创建一个HTTP服务器而没有任何用于学习目的的HTTP库。现在它可以很好地提供静态文件。

我提供文件的方式是通过这段代码:

;WITH cte AS (
select  tb.[Months],
        tb.[Month], 
        tb.[Day], 
        COUNT(tb.intId) as [Total]
from (
        select  intId, 
                MONTH(dtRegDate) as [Months],
                datename(month, dtRegDate) as [Month], 
                DATENAME(DAY, dtRegDate) as [Day]
        from tblUserDetails
    ) tb
group by tb.Month, tb.day, Months
)

SELECT *
FROM cte
PIVOT (
    SUM([Total]) FOR [Day] IN ([1],[2],[3]...)
) pvt
order by [Months]

但是,我希望通过发送压缩数据而不是未压缩来优化其性能。我知道我的浏览器(Chrome)接受压缩数据,因为它在标题中告诉我

with open(self.filename, 'rb') as f:
    src = f.read()
socket.sendall(src)

所以,我将代码更改为

Accept-Encoding: gzip, deflate, sdch

但这只是输出垃圾。我做错了什么?

1 个答案:

答案 0 :(得分:3)

zlib库实现了deflate压缩算法(RFC 1951)。 deflate压缩有两种封装:zlib(RFC 1950)和gzip(RFC 1952)。它们的区别在于它们围绕deflate压缩数据提供的标题和尾部类型。

zlib.compress仅提供原始deflate数据,没有任何标题和预告片。要获得这些,您需要使用压缩对象。对于gzip,这看起来像这样:

z = zlib.compressobj(-1,zlib.DEFLATED,31)
gzip_compressed_data = z.compress(data) + z.flush()

这里的重要部分是31作为compressobj的第三个参数。这指定了gzip格式,然后可以与Content-Encoding: gzip一起使用。