內容編碼
如 HTTP 通訊協定 (RFC 2616) 應用程式所指定,可以要求伺服器以編碼格式傳回 HTTP 回應。 在 Windows Server 2008 和 Windows Vista 之前,具有內容編碼的要求會傳送至應用程式,以在其層級進行處理。 從 Windows Server 2008 和 Windows Vista 開始,應用程式可以指示 WinINet 執行 gzip 和 deflate 內容編碼方案的內容解碼。
若要啟用內容譯碼,應用程式會設定譯碼選項,要求 WinINet 代表他們執行譯碼。 不過,啟用譯碼並不保證 WinINet 會執行內容譯碼,而且應用程式應該準備好處理譯碼。 WinINet 會在成功執行內容譯碼時,從回應中移除內容編碼標頭。 應用程式應該處理內容譯碼,不論回應中是否存在內容編碼標頭時,是否啟用或停用譯碼選項。
啟用譯碼時,應用程式必須在要求的 Accept-Encoding 標頭中指定支援的編碼清單。 不過,Accept-Encoding 標頭不強制伺服器傳送編碼的回應。 WinINet 會將不符合可接受的編碼清單的回應傳送回應用程式。
下列清單描述啟用選項時,WinINet 將執行內容譯碼的條件:
- Accept-Encoding 標頭必須存在於要求中,而且必須指定 gzip、deflate 或 gzip 和 deflate 編碼配置。
- Content-Encoding 標頭中指定的編碼配置必須符合 Accept-Encoding 標頭中指定的其中一個編碼配置。
- 回應中的 Content-Encoding 標頭只會指定一個編碼配置。
- 回應必須只包含一個 Content- Encoding 標頭。 WinINet 會解碼只用一種編碼方式編碼的內容。
- Cache-Control 標頭不得包含 no-transform 指示詞。
- Content-Range 標頭不得出現在回應中。
設定解壓縮選項
可以在會話句柄、要求句柄或連接句柄上設定譯碼選項。 設定譯碼選項的控制元件定義了譯碼選項的範圍。 例如,在會話期間設定解碼,將會啟用解碼於該操作下建立的所有連線和請求。
若要設定譯碼選項,應用程式會呼叫 InternetSetOption,並使用 從 InternetOpen返回的句柄、InternetConnect或 HttpOpenRequest。 INTERNET_OPTION_HTTP_DECODING 選項是在 dwOption 參數中指定,而 lpBuffer 參數會指向設定為 true 的布爾變數。 若要停用譯碼,應用程式會呼叫 InternetSetOption,並將 INTERNET_OPTION_HTTP_DECODING 選項中的布爾變數設定為 false。
設定譯碼選項時,當應用程式呼叫 InternetReadFile時,WinINet 會對要求執行譯碼。 如果在執行內容譯碼時 WinINet 發生錯誤,則呼叫 InternetReadFile 會失敗,並出現 ERROR_INTERNET_DECODING_FAILED。 譯碼失敗時,應用程式有兩個選項:它可以移除 Accept-Encoding 標頭並重新傳送要求,也可以將要求上的 [INTERNET_OPTION_HTTP_DECODING] 選項設定為 false,然後重新傳送要求。 如果解碼選項設定為 false,應用程式必須檢查 Content-Encoding 標頭,並在應用層級執行任何解碼操作。
注意
WinINet 不支援伺服器實作。 此外,這不應該在服務中使用。 針對伺服器實作或服務,請使用 Microsoft Windows HTTP 服務 (WinHTTP)。