2016-09-09 10 views
1

私は学習目的でHTTPライブラリを使わずにPythonでHTTPサーバを作成しています。今は静的ファイルをうまく処理できます。PythonのTCPソケットを使ってgzip圧縮データを送信する

私はファイルを提供方法は、コードのこの作品を通じてです:

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

しかし、私は少し圧縮されたデータの代わりに、非圧縮を送信することにより、その性能を最適化したいです。それはヘッダに私に語ったので、私はそう

私のブラウザ(クローム)が圧縮されたデータを受け入れること
Accept-Encoding: gzip, deflate, sdch 

を知って、私はこの

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

に私のコードを変更しかし、これは単なるゴミを出力します。私は間違って何をしていますか?

+0

適切な 'Content-Encoding = gzip'ヘッダーを送信しましたか? –

+0

はい、あります。私がGETリクエストで返すデータは、ヘッダーと2つのCRLFとそれに続く圧縮されたボディです。これはゴミを出力します。すべてを圧縮すると(これにはヘッダーが含まれます)、代わりにブラウザがファイルをダウンロードします。 – user5508097

答えて

2

zlibライブラリは、deflate圧縮アルゴリズム(RFC 1951)を実装しています。デフレート圧縮には、zlib(RFC 1950)とgzip(RFC 1952)という2つのカプセル化があります。これらは、圧縮された圧縮データの周りに提供されるヘッダとトレーラの種類だけが異なります。

zlib.compressは、ヘッダーと予告編のない生の収縮データのみを提供します。これらを取得するには、圧縮オブジェクトを使用する必要があります。 gzipのために、これは次のようになります。

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

ここで重要な部分はcompressobjの第三引数として31です。これは、Content-Encoding: gzipで使用できるgzip形式を指定します。

+0

説明ありがとうございます! – user5508097

関連する問題