内容编码

如 HTTP 协议 (RFC 2616) 应用程序可以请求服务器以编码格式返回 HTTP 响应。 在 Windows Server 2008 和 Windows Vista 之前,带有内容编码的请求已发送到应用程序,以在其级别进行处理。 从 Windows Server 2008 和 Windows Vista 开始,应用程序可以指示 WinINet 对 gzip 和内容编码方案执行内容解码。

为了启用内容解码,应用程序设置解码选项,请求 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 标头。

设置解压缩选项

可以在会话句柄、请求句柄或连接句柄上设置解码选项。 设置解码选项的句柄定义解码选项的范围。 例如,在会话上设置解码将启用在该句柄下创建的所有连接和请求的解码。

若要设置解码选项,应用程序使用从 InternetOpenInternetConnect 或HttpOpenRequest 返回的句柄调用 InternetSetOptionINTERNET_OPTION_HTTP_DECODING 选项在 dwOption 参数中指定,lpBuffer 参数指向设置为 true 的布尔变量。 为了禁用解码,应用程序使用 INTERNET_OPTION_HTTP_DECODING 选项和设置为 false 的布尔变量调用 InternetSetOption

设置解码选项后,当应用程序调用 InternetReadFile 时,WinINet 会对请求执行解码。 如果 WinINet 在执行内容解码时遇到错误,则对 InternetReadFile 的调用将失败并 出现ERROR_INTERNET_DECODING_FAILED。 当解码失败时,应用程序有两个选项:它可以删除Accept-Encoding标头并重新发送请求,也可以将请求上的 INTERNET_OPTION_HTTP_DECODING 选项设置为 false,然后重新发送请求。 如果解码选项设置为 false,则应用程序必须检查 Content-Encoding 标头并在应用程序级别执行任何解码。

注意

WinINet 不支持服务器实现。 此外,不应从服务使用它。 对于服务器实现或服务,请使用 Microsoft Windows HTTP Services (WinHTTP)