Поделиться через


Кодирование контента

Как указано в протоколе 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 не должен присутствовать в ответе.

Настройка параметра распаковки

Параметр декодирования можно задать для дескриптора сеанса, дескриптора запроса или дескриптора подключения. Дескриптор, для которого задан параметр декодирования, определяет область параметра декодирования. Например, настройка декодирования в сеансе позволит декодировать все подключения и запросы, созданные под этим дескриптором.

Чтобы задать параметр декодирования, приложение вызывает InternetSetOption с дескриптором, возвращенным из InternetOpen, InternetConnect или HttpOpenRequest. Параметр INTERNET_OPTION_HTTP_DECODING указывается в параметре dwOption , а параметр lpBuffer указывает на логическую переменную, заданную в значение true. Чтобы отключить декодирование, приложение вызывает InternetSetOption с параметром INTERNET_OPTION_HTTP_DECODING , а логическая переменная имеет значение false.

Если задан параметр декодирования, WinINet выполняет декодирование запроса, когда приложение вызывает InternetReadFile. Если winINet обнаруживает ошибку при декодировании содержимого, вызов InternetReadFile завершается сбоем с ERROR_INTERNET_DECODING_FAILED. Если декодирование завершается сбоем, приложение может удалить заголовок Accept-Encoding и повторно отправить запрос или задать для параметра INTERNET_OPTION_HTTP_DECODING в запросе значение false, а затем повторно отправить запрос. Если параметр декодирования имеет значение false, приложение должно проверка заголовок Content-Encoding и выполнять декодирование на уровне приложения.

Примечание

WinINet не поддерживает реализации сервера. Кроме того, его не следует использовать из службы. Для серверных реализаций или служб используйте службы Microsoft Windows HTTP (WinHTTP).