内容编码

如 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 指令。
  • 内容范围标头不得存在于响应中。

设置解压缩选项

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

若要设置解码选项,应用程序使用从 InternetOpenInternetConnectHttpOpenRequest 返回的句柄调用 InternetSetOptiondwOption 参数中指定了INTERNET_OPTION_HTTP_DECODING选项,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 服务 (WinHTTP)