2011-03-12 4 views
25

청크 인코딩 인 http 응답을 올바르게 gzip으로 내 웹 서버에 보내려고합니다.청크 인코딩 응답의 gzip 압축?

비 GZIP 응답에 대한 이해가이 모양이다

: 각 청크에 대한 다음

<the response headers> 

과,

<chunk length in hex>\r\n<chunk>\r\n 

그리고 마지막으로 제로 길이의 덩어리 :

0\r\n\r\n 

나는 gzip 압축 작업을 시도하고 어떤 도움이 필요합니까? 잠정적으로 반환됩니다. 나는 전체 일을 gzip을, 심지어 청크 분할하지 않고 응답을 반환하려고

HTTP servers sometimes use compression (gzip) or deflate methods to optimize transmission. 
Chunked transfer encoding can be used to delimit parts of the compressed object. 
In this case the chunks are not individually compressed. Instead, the complete payload 
is compressed and the output of the compression process is chunk encoded. 

, 그것은 작동하지 않았다 :이 문서는 각 청크를 Gzip으로 압축 반대로 전체 응답, gzip으로 압축되어야 함을 의미한다. 나는 Content-Encoding 헤더를 "gzip"으로 설정하려고 시도했다. 누군가 청크의 gzipping을 지원하기 위해 위 스키마에 변경 사항을 만들어야한다고 설명 할 수 있습니까? 감사.

답변

19

당신은 내용을 gzip을, 오직 다음 청크 분할 인코딩을 적용

청크 "때문에" "유일한 전송 코딩은 메시지를 구분하는 데 중요한 역할을, HTTP/1.1받는 사람이 이해하는 데 필요한 요청에서 페이로드 본문에 전송 코딩이 적용될 때마다 적용되는 최종 전송 코딩은 반드시 "청크"되어야합니다. 전송 코딩이 응답 페이로드 본문에 적용되는 경우 최종 전송 "chunked"전송 코딩이 사용되는 경우 메시지 본문을 형성하기 위해 적용된 마지막 전송 코딩이어야합니다. "chunked" 전송 부호화는 메시지 본문에 두 번 이상 적용되어서는 안된다. " 다른 답변이 충분히 명확하지 않았다 경우

(HTTPbis Part1, Section 6.2.1)

+0

정확히 그가하고있는 말은 맞습니까? – sosiouxme

+1

첫 번째 문장은 정말 혼란 스럽습니다. 나는 그것이 바뀌어야한다고 생각합니다 ..... 당신은 각 청크의 몸을 gzip으로 묶었습니다. (단지 구현했고 그것은 매력처럼 작동했습니다). 전체 내용을 gzip으로 압축하지 않고 청크 분할 인코딩을 적용합니다. 각 본문을 gzip하고 청크 크기를 압축 된 바이트 배열 크기로 표시합니다. –

1

아마도 당신은 적절하게 gzip 된 응답을 보내지 않을 것입니다.

zlib에서 window bits31으로 설정해보십시오. deflateInit2()을 사용하십시오.

+1

이것은 구현에 대해 몇 가지 가정을합니다.압축 된 파일을 반환하기 위해 "gzip"명령을 사용하여 파일을 압축하고 Content-Encoding : gzip 헤더를 설정하는 동안 반환 한 경우 어떻게해야합니까? 같은 결과물을 가지고 있습니까? – sosiouxme

+0

HTTP 표준은 실제로 ** zlib ** 라이브러리를 사용해야합니다. 'gzip' 명령은 더 많은 헤더를 출력하지만, 다른 HTTP 클라이언트/서버에서 사용되는 zlib과 호환 가능해야합니다. – unixman83

+0

포스터가 'Content-Length' 헤더를 설정하지 않았거나 Chunked 응답을 부적절하게 보내는 것일 수 있습니다. 헤더 뒤에 나오는 개행 줄 바꿈과 같은 기본적인 것을 잊어 버리는 것입니다. – unixman83

24

:

먼저 당신은 당신이 모든 걸 필요가 없습니다이 스트림에서 수행 할 수 있습니다 (ZLIB으로 몸을 gzip으로 한 번에 메모리에 저장되는데, 이것이 덩어리의 전체 요점 임).

그런 다음 압축 된 본문을 Content-Encoding : gzip 및 Transfer-Encoding : chunked 헤더 (그리고 gzip 스트림이 제공하는 것일 수도 있음)로 보내십시오. Content-Length 헤더 없음).

압축 용으로 gzip이나 zcat 또는 그런 유틸리티를 사용하고 있다면 아마도 작동하지 않을 것입니다. zlib이 필요합니다. 덩어리를 만든 다음 압축하면 분명히 작동하지 않습니다. 이 작업을 올바르게 수행하고 있다고 생각하고 작동하지 않는다면, 패킷 추적을 사용하고 그로 인해 발생하는 오류 메시지를 토대로 질문 할 수 있습니다.