2016-09-09 5 views
1

나는 학습을 위해 HTTP 라이브러리없이 파이썬에서 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)을 구현합니다. deflate 압축에는 zlib (RFC 1950) 및 gzip (RFC 1952)의 두 가지 캡슐화가 있습니다. 이는 압축 된 압축 데이터 주변에서 제공되는 헤더 및 트레일러의 종류 만 다릅니다.

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