2011-03-12 179 views
25

我試圖讓我的web服務器正確地gzip一個http響應,它是塊編碼。分塊編碼響應的gzip壓縮?

我非gzip的響應的理解是,它看起來像這樣:

<the response headers> 

,然後對於每個大塊,

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

終於,零長度塊:

0\r\n\r\n 

我試圖讓gzip壓縮工作,我可以使用一些幫助確定什麼應該交流一定會被退回。本文檔意味着整個響應應該用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壓縮了整個事情,即使沒有分塊返回響應,並沒有奏效。我嘗試將Content-Encoding標頭設置爲「gzip」。有人可以解釋一下上面的方案必須做什麼改變來支持gzip塊嗎?謝謝。

回答

19

您gzip壓縮的內容,然後才申請的分塊編碼:

「自‘分塊’是唯一的傳輸編碼必須通過HTTP/1.1接收者可以理解,它在劃定的消息了至關重要的作用在一個持久連接上,每當一個轉移編碼被應用到一個請求中的一個有效載荷體上時,所應用的最後一個轉移編碼必須是「chunked」的,如果一個轉移編碼被應用到一個響應有效載荷體上, - 應用的編碼必須是「分塊的」,或者必須通過關閉連接來終止消息,當使用「分塊」傳輸編碼時,它必須是最後一個用於形成消息體的傳輸編碼,「分塊」傳遞編碼絕不能在消息體中多次應用。「

HTTPbis Part1, Section 6.2.1

+0

他說他在做什麼,對吧? – sosiouxme 2012-01-19 21:19:49

+1

第一句話在這真是令人困惑。我認爲它應該改變.....你gzip每個塊的身體(我剛剛實施它,它像一個魅力工作)。您不會gzip整個內容,然後應用分塊編碼。你可以gzip每個主體並將塊大小標記爲壓縮的字節數組大小。 – 2016-08-30 04:27:09

1

可能你並沒有真正發送一個適當的gzip響應。

嘗試在zlib中設置window bits31。並使用deflateInit2()

+1

這對實現做了一些假設。如果要返回一個壓縮文件,他只是使用「gzip」命令壓縮文件,並在設置Content-Encoding:gzip頭文件時返回該文件?它有相同的輸出嗎? – sosiouxme 2012-01-19 21:21:52

+0

HTTP標準確實需要使用** zlib **庫。 'gzip'命令會輸出更多的頭文件,但是應該與大多數其他HTTP客戶端/服務器中使用的zlib兼容。 – unixman83 2012-01-20 18:31:20

+0

更有可能是海報未設置「Content-Length」標頭或發送的是分塊響應不正確。或者在標題後忘記了一些基本的東西,比如尾隨的換行符。 – unixman83 2012-01-20 18:33:08

24

如果其他的答案還不夠明確:

首先你gzip壓縮的身體與zlib的(這可以在流來完成,所以你並不需要整個事情在內存中,這是整塊的重點)。

然後,你用塊發送壓縮主體(大概是由gzip流提供的那個,塊頭用來聲明它有多長),使用Content-Encoding:gzip和Transfer-Encoding:chunked headers(和沒有內容長度標題)。

如果您使用gzip或zcat或某些此類實用程序進行壓縮,則可能無法使用。需要是zlib。如果你正在創建塊並壓縮它們,那肯定無法工作。如果您認爲自己做得對並且無法正常工作,那麼您可以嘗試使用數據包跟蹤並根據您收到的錯誤消息提出問題。