2012-03-18 48 views
11

私はPythonでクライアント/サーバーアーキテクチャを作成しました。私はコードから別のHTTPサーバーを要求することによって提供されるクライアントからHTTPリクエストを受け取ります。pythonでHTTPレスポンスで返されたgzip圧縮データをデコードするには?

私はgzip圧縮データを解読できませんでした。私は最初に回答データを\r\nという分離文字として分割しました。これはリストの最後の項目としてデータを取得しました。

zlib.decompress(data[-1]) 

しかし、間違ったヘッダーのエラーが表示されます。この問題をどうやって解決するべきですか?私は、クライアントと第二サーバーの間で転送されているデータを読みたい

コード

client_reply = '' 
       while 1: 
        chunk = server2.recv(512) 
        if len(chunk) : 
         client.send(chunk) 
         client_reply += chunk 
        else: 
         break 
       client_split = client_reply.split("\r\n") 
       print client_split[-1].decode('zlib') 

+1

コードを表示してください!データが不適切にエンコード/デコードされていない(つまり、バイナリデータとして扱われる)ことは確実ですか? – Cameron

+0

データが複数のチャンクに分割されていて、正しい長さを得るためにヘッダーを解析する必要があるかもしれません。 gzippedヘッダーには長さ情報 –

+0

があります。圧縮データそのものに "\ r \ n"がある場合は、それを分解して圧縮データの代わりにその一部だけをデコードしますか?私は "\ r \ n"をサーバーで見つけようとしていますが、問題がある場合はそれを検証するために送信します。 –

答えて

1

https://www.w3.org/Protocols/rfc2616/rfc2616-sec6.htmlによれば、ヘッダーと本文は、CRLF文字のみを含む空行で区切られています。 2つのアイテム、ヘッダとボディとの結果がされて配列 - あなたは、分割は、空行を検索し、追加のパラメータは、分割数を制限し

client_split = client_reply.split("\r\n\r\n",1) 
print client_split[1].decode('zlib') 

を試みることができます。しかし、あなたのコードと分割される実際の文字列についてもっと知らなくても、何かを推薦するのは難しいです。

4

zlib.decompress(string, wbits, bufsize)を使用する場合は、wbitsを指定します。たとえば、「トラブルシューティング」の最後を参照してください。我々はそれが圧縮された事のいくつかの並べ替えで手を前に知って、mabye deflate多分gzip

トラブルシューティング

は、未知の「コンテンツ・エンコーディング」でバイト範囲の応答をダウンロードAA curlコマンド(ノートから始めましょう):以下の応答ヘッダーで

export URL="https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-18/segments/1461860106452.21/warc/CC-MAIN-20160428161506-00007-ip-10-239-7-51.ec2.internal.warc.gz" 
curl -r 266472196-266527075 $URL | gzip -dc | tee hello.txt 

HTTP/1.1 206 Partial Content 
x-amz-id-2: IzdPq3DAPfitkgdXhEwzBSwkxwJRx9ICtfxnnruPCLSMvueRA8j7a05hKr++Na6s 
x-amz-request-id: 14B89CED698E0954 
Date: Sat, 06 Aug 2016 01:26:03 GMT 
Last-Modified: Sat, 07 May 2016 08:39:18 GMT 
ETag: "144a93586a13abf27cb9b82b10a87787" 
Accept-Ranges: bytes 
Content-Range: bytes 266472196-266527075/711047506 
Content-Type: application/octet-stream 
Content-Length: 54880 
Server: AmazonS3 

だから、ポイントに。我々は進値で作業しているもののいくつかの基本を見ることができます

0000000: 1f8b 0800 0000 0000 0000 ecbd eb 

curl -r 266472196-266472208 $URL | xxd

進出力:

は、最初の10バイトの六角出力を表示することができます。大雑把にFAT32システム(00)を使用して、修正時刻(0000 0000)、またはセット余分なフラグ(00)なし(0800)収縮使用して、そのおそらくGZIP(1f8b)を意味

セクション2.3/2.3を参照してください。1:だからパイソンへhttps://tools.ietf.org/html/rfc1952#section-2.3.1

>>> import zlib 
:同様の

>>> import requests 
>>> url = 'https://commoncrawl.s3.amazonaws.com/crawl-data/CC-MAIN-2016-18/segments/1461860106452.21/warc/CC-MAIN-20160428161506-00006-ip-10-239-7-51.ec2.internal.warc.gz' 
>>> response = requests.get(url, params={"range":"bytes=257173173-257248267"}) 
>>> unknown_compressed_data = response.content 

予告何

>>> unknown_compressed_data[:10] 
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x00' 

そしてちょうど(documentation)に基づいてランダムに試してみましょう解凍の上?:

"zlib.error:エラー-2プリペアデータを解凍するリング:矛盾ストリーム状態 "

>>> zlib.decompress(unknown_compressed_data, -31) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
zlib.error: Error -2 while preparing to decompress data: inconsistent stream state 

"エラー-3データを解凍中:誤ったヘッダチェック":

>>> zlib.decompress(unknown_compressed_data) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
zlib.error: Error -3 while decompressing data: incorrect header check 

" zlib.error:エラー-3しばらく解凍データ:無効な距離すぎてバック」

>>> zlib.decompress(unknown_compressed_data, 30) 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
zlib.error: Error -3 while decompressing data: invalid distance too far back 

可能なS olution:

>>> zlib.decompress(unknown_compressed_data, 31) 
'WARC/1.0\r\nWARC-Type: response\r\nWARC-Date: 2016-04-28T20:14:16Z\r\nWARC-Record-ID: <urn:uu 
+0

素晴らしいです。これは私のために働いた。 – bibbsey

関連する問題