2012-03-18 3 views
11

파이썬에서 클라이언트/서버 아키텍처를 만들었습니다. 코드를 통해 다른 HTTP 서버를 요청함으로써 제공되는 클라이언트로부터 HTTP 요청을받습니다.파이썬에서 HTTP 응답으로 반환 된 gzip 압축 데이터를 디코딩하는 방법은 무엇입니까?

gzip으로 압축 된 데이터를 디코딩 할 수없는 세 번째 서버에서 응답을 받으면 먼저 응답 데이터를 \r\n을 사용하여 분리 문자로 분리합니다.이 문자는 목록에서 마지막 항목으로 데이터를 얻었습니다.

zlib.decompress(data[-1]) 

으로 압축을 풀지 만 올바르지 않은 헤더 오류가 발생합니다. 이 문제는 어떻게 해결해야합니까?

나는 클라이언트와 2 서버 사이에 전송 된 된 데이터를 읽을 수

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 문자 만 포함 된 빈 줄로 구분됩니다. 당신은 분할은 빈 줄을 찾아 추가 매개 변수는 분할의 수를 제한

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

시도 할 수 - 결과 인 배열을 두 항목, 헤더와 몸. 그러나 코드와 실제 문자열이 분할되는 것에 대해 더 많이 알지 못하면 아무 것도 추천하기가 어렵습니다.

4

zlib.decompress(string, wbits, bufsize)을 사용하는 경우 wbits을 지정하십시오 (예 : "문제 해결"끝 부분 참조).

문제 해결

는 (알 수없는 "콘텐츠 인코딩"을 가진 바이트 범위 응답을 다운로드 참고 AA curl 명령으로 시작하자 : 우리는 손 전에 알고는 mabye, deflate 어쩌면 gzip 압축 된 물건의 일종) : 다음 응답 헤더와

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 

. curl -r 266472196-266472208 $URL | xxd

진수 출력 :

0000000: 1f8b 0800 0000 0000 0000 ecbd eb 

우리는 우리가 16 진수 값으로 작업하는 것의 몇 가지 기본을 볼 수 있습니다

는 처음 10 바이트의 진수 출력을 표시 할 수 있습니다.

은 대략 수정 시간 ( 0000 0000)없이 수축 사용하여 아마 GZIP ( 1f8b) ( 0800)을 의미, 또는 여분의 플래그는 FAT32 시스템 ( 00)를 사용하여, ( 00)을 설정합니다.

섹션 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 prepa 링 데이터의 압축을 해제합니다 : 일관성 스트림 상태 " :

>>> 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 

가능하다 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